@livestore/utils-dev 0.3.2-dev.0 → 0.3.2-dev.1
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/.tsbuildinfo.json +1 -1
- package/dist/node/FileLogger.d.ts +14 -0
- package/dist/node/FileLogger.d.ts.map +1 -0
- package/dist/node/FileLogger.js +151 -0
- package/dist/node/FileLogger.js.map +1 -0
- package/dist/node/mod.d.ts +1 -0
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +4 -3
- package/dist/node/mod.js.map +1 -1
- package/package.json +8 -8
- package/src/node/FileLogger.ts +206 -0
- package/src/node/mod.ts +7 -3
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Layer, Logger } from '@livestore/utils/effect';
|
|
2
|
+
export declare const makeFileLogger: (logFilePath: string, options?: {
|
|
3
|
+
readonly threadName: string;
|
|
4
|
+
readonly colors?: boolean;
|
|
5
|
+
}) => Layer.Layer<never, never, never>;
|
|
6
|
+
export declare const defaultDateFormat: (date: Date) => string;
|
|
7
|
+
export declare const structuredMessage: (u: unknown) => unknown;
|
|
8
|
+
export declare const prettyLoggerTty: (options: {
|
|
9
|
+
readonly colors: boolean;
|
|
10
|
+
readonly stderr: boolean;
|
|
11
|
+
readonly formatDate: (date: Date) => string;
|
|
12
|
+
readonly onLog?: (str: string) => void;
|
|
13
|
+
}) => Logger.Logger<unknown, string>;
|
|
14
|
+
//# sourceMappingURL=FileLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileLogger.d.ts","sourceRoot":"","sources":["../../src/node/FileLogger.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,EAEL,MAAM,EAIP,MAAM,yBAAyB,CAAA;AAEhC,eAAO,MAAM,cAAc,GACzB,aAAa,MAAM,EACnB,UAAU;IACR,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B,qCAqBA,CAAA;AAmCH,eAAO,MAAM,iBAAiB,GAAI,MAAM,IAAI,KAAG,MAI8B,CAAA;AAE7E,eAAO,MAAM,iBAAiB,GAAI,GAAG,OAAO,KAAG,OAW9C,CAAA;AAqBD,eAAO,MAAM,eAAe,GAAI,SAAS;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAA;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC,mCAoFA,CAAA"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import util from 'node:util';
|
|
4
|
+
import { Cause, Effect, FiberId, HashMap, Inspectable, Layer, List, Logger, LogSpan, ReadonlyArray, } from '@livestore/utils/effect';
|
|
5
|
+
export const makeFileLogger = (logFilePath, options) => Layer.unwrapScoped(Effect.gen(function* () {
|
|
6
|
+
yield* Effect.sync(() => fs.mkdirSync(path.dirname(logFilePath), { recursive: true }));
|
|
7
|
+
const logFile = yield* Effect.acquireRelease(Effect.sync(() => fs.openSync(logFilePath, 'a', 0o666)), (fd) => Effect.sync(() => fs.closeSync(fd)));
|
|
8
|
+
return Logger.replace(Logger.defaultLogger, prettyLoggerTty({
|
|
9
|
+
colors: options?.colors ?? false,
|
|
10
|
+
stderr: false,
|
|
11
|
+
formatDate: (date) => `${defaultDateFormat(date)} ${options?.threadName ?? ''}`,
|
|
12
|
+
onLog: (str) => fs.writeSync(logFile, str),
|
|
13
|
+
}));
|
|
14
|
+
}));
|
|
15
|
+
const withColor = (text, ...colors) => {
|
|
16
|
+
let out = '';
|
|
17
|
+
for (let i = 0; i < colors.length; i++) {
|
|
18
|
+
out += `\x1b[${colors[i]}m`;
|
|
19
|
+
}
|
|
20
|
+
return `${out}${text}\x1b[0m`;
|
|
21
|
+
};
|
|
22
|
+
const withColorNoop = (text, ..._colors) => text;
|
|
23
|
+
const colors = {
|
|
24
|
+
bold: '1',
|
|
25
|
+
red: '31',
|
|
26
|
+
green: '32',
|
|
27
|
+
yellow: '33',
|
|
28
|
+
blue: '34',
|
|
29
|
+
cyan: '36',
|
|
30
|
+
white: '37',
|
|
31
|
+
gray: '90',
|
|
32
|
+
black: '30',
|
|
33
|
+
bgBrightRed: '101',
|
|
34
|
+
};
|
|
35
|
+
const logLevelColors = {
|
|
36
|
+
None: [],
|
|
37
|
+
All: [],
|
|
38
|
+
Trace: [colors.gray],
|
|
39
|
+
Debug: [colors.blue],
|
|
40
|
+
Info: [colors.green],
|
|
41
|
+
Warning: [colors.yellow],
|
|
42
|
+
Error: [colors.red],
|
|
43
|
+
Fatal: [colors.bgBrightRed, colors.black],
|
|
44
|
+
};
|
|
45
|
+
export const defaultDateFormat = (date) => `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date
|
|
46
|
+
.getSeconds()
|
|
47
|
+
.toString()
|
|
48
|
+
.padStart(2, '0')}.${date.getMilliseconds().toString().padStart(3, '0')}`;
|
|
49
|
+
export const structuredMessage = (u) => {
|
|
50
|
+
switch (typeof u) {
|
|
51
|
+
case 'bigint':
|
|
52
|
+
case 'function':
|
|
53
|
+
case 'symbol': {
|
|
54
|
+
return String(u);
|
|
55
|
+
}
|
|
56
|
+
default: {
|
|
57
|
+
return Inspectable.toJSON(u);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const consoleLogToString = (...s) => {
|
|
62
|
+
if (s.length === 0)
|
|
63
|
+
return '';
|
|
64
|
+
const [first, ...rest] = s;
|
|
65
|
+
if (typeof first === 'string') {
|
|
66
|
+
return rest.length > 0 ? util.format(first, ...rest.map(structuredMessage)) : first;
|
|
67
|
+
}
|
|
68
|
+
return s
|
|
69
|
+
.map((v) => {
|
|
70
|
+
if (typeof v === 'string')
|
|
71
|
+
return v;
|
|
72
|
+
return util.inspect(structuredMessage(v), {
|
|
73
|
+
depth: 3,
|
|
74
|
+
colors: false,
|
|
75
|
+
compact: false,
|
|
76
|
+
breakLength: 120,
|
|
77
|
+
});
|
|
78
|
+
})
|
|
79
|
+
.join(' ');
|
|
80
|
+
};
|
|
81
|
+
export const prettyLoggerTty = (options) => {
|
|
82
|
+
const color = options.colors ? withColor : withColorNoop;
|
|
83
|
+
return Logger.make(({ annotations, cause, date, fiberId, logLevel, message: message_, spans }) => {
|
|
84
|
+
let str = '';
|
|
85
|
+
const log = (...s) => {
|
|
86
|
+
str += `${consoleLogToString(...s)}\n`;
|
|
87
|
+
options.onLog?.(str);
|
|
88
|
+
};
|
|
89
|
+
const logIndented = (...s) => {
|
|
90
|
+
str += `${consoleLogToString(...s).replace(/^/gm, ' ')}\n`;
|
|
91
|
+
options.onLog?.(str);
|
|
92
|
+
};
|
|
93
|
+
const message = ReadonlyArray.ensure(message_);
|
|
94
|
+
let firstLine = color(`[${options.formatDate(date)}]`, colors.white) +
|
|
95
|
+
` ${color(logLevel.label, ...logLevelColors[logLevel._tag])}` +
|
|
96
|
+
` (${FiberId.threadName(fiberId)})`;
|
|
97
|
+
if (List.isCons(spans)) {
|
|
98
|
+
const now = date.getTime();
|
|
99
|
+
const render = LogSpan.render(now);
|
|
100
|
+
for (const span of spans) {
|
|
101
|
+
firstLine += ` ${render(span)}`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
firstLine += ':';
|
|
105
|
+
let messageIndex = 0;
|
|
106
|
+
if (message.length > 0) {
|
|
107
|
+
const firstMaybeString = structuredMessage(message[0]);
|
|
108
|
+
if (typeof firstMaybeString === 'string') {
|
|
109
|
+
firstLine += ` ${color(firstMaybeString, colors.bold, colors.cyan)}`;
|
|
110
|
+
messageIndex++;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
log(firstLine);
|
|
114
|
+
// if (!processIsBun) console.group()
|
|
115
|
+
if (!Cause.isEmpty(cause)) {
|
|
116
|
+
logIndented(Cause.pretty(cause, { renderErrorCause: true }));
|
|
117
|
+
}
|
|
118
|
+
if (messageIndex < message.length) {
|
|
119
|
+
for (; messageIndex < message.length; messageIndex++) {
|
|
120
|
+
const msg = message[messageIndex];
|
|
121
|
+
if (typeof msg === 'object' && msg !== null) {
|
|
122
|
+
logIndented(util.inspect(structuredMessage(msg), {
|
|
123
|
+
depth: 3,
|
|
124
|
+
colors: false,
|
|
125
|
+
compact: false,
|
|
126
|
+
breakLength: 120,
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
logIndented(Inspectable.redact(msg));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (HashMap.size(annotations) > 0) {
|
|
135
|
+
for (const [key, value] of annotations) {
|
|
136
|
+
const formattedValue = typeof value === 'object' && value !== null
|
|
137
|
+
? util.inspect(structuredMessage(value), {
|
|
138
|
+
depth: 3,
|
|
139
|
+
colors: false,
|
|
140
|
+
compact: false,
|
|
141
|
+
breakLength: 120,
|
|
142
|
+
})
|
|
143
|
+
: Inspectable.redact(value);
|
|
144
|
+
logIndented(color(`${key}:`, colors.bold, colors.white), formattedValue);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// if (!processIsBun) console.groupEnd()
|
|
148
|
+
return str;
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=FileLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileLogger.js","sourceRoot":"","sources":["../../src/node/FileLogger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,WAAW,EACX,KAAK,EACL,IAAI,EACJ,MAAM,EAEN,OAAO,EACP,aAAa,GACd,MAAM,yBAAyB,CAAA;AAEhC,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,WAAmB,EACnB,OAGC,EACD,EAAE,CACF,KAAK,CAAC,YAAY,CAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAEtF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EACvD,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAC5C,CAAA;IAED,OAAO,MAAM,CAAC,OAAO,CACnB,MAAM,CAAC,aAAa,EACpB,eAAe,CAAC;QACd,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK;QAChC,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE;QAC/E,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC;KAC3C,CAAC,CACH,CAAA;AACH,CAAC,CAAC,CACH,CAAA;AAEH,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,GAAG,MAA6B,EAAE,EAAE;IACnE,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,GAAG,IAAI,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA;IAC7B,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,IAAI,SAAS,CAAA;AAC/B,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,GAAG,OAA8B,EAAE,EAAE,CAAC,IAAI,CAAA;AAE/E,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,IAAI;IACT,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,KAAK;CACV,CAAA;AAEV,MAAM,cAAc,GAA6D;IAC/E,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IACxB,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;IACnB,KAAK,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;CAC1C,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAU,EAAU,EAAE,CACtD,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI;KACpG,UAAU,EAAE;KACZ,QAAQ,EAAE;KACV,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AAE7E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAU,EAAW,EAAE;IACvD,QAAQ,OAAO,CAAC,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAQ,EAAE,EAAE;IACzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAC7B,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACrF,CAAC;IACD,OAAO,CAAC;SACL,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAA;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;YACxC,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,GAAG;SACjB,CAAC,CAAA;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAK/B,EAAE,EAAE;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAA;IACxD,OAAO,MAAM,CAAC,IAAI,CAAkB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAChH,IAAI,GAAG,GAAG,EAAE,CAAA;QAEZ,MAAM,GAAG,GAAG,CAAC,GAAG,CAAQ,EAAE,EAAE;YAC1B,GAAG,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;YACtC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,CAAC,GAAG,CAAQ,EAAE,EAAE;YAClC,GAAG,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAA;YAC3D,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC,CAAA;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE9C,IAAI,SAAS,GACX,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;YACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;YAC7D,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAA;QAErC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,SAAS,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;YACjC,CAAC;QACH,CAAC;QAED,SAAS,IAAI,GAAG,CAAA;QAChB,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACtD,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBACzC,SAAS,IAAI,IAAI,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;gBACpE,YAAY,EAAE,CAAA;YAChB,CAAC;QACH,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,CAAA;QACd,qCAAqC;QAErC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC9D,CAAC;QAED,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC;gBACrD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;gBACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBAC5C,WAAW,CACT,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE;wBACnC,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,KAAK;wBACb,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,GAAG;qBACjB,CAAC,CACH,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;gBACvC,MAAM,cAAc,GAClB,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;oBACzC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;wBACrC,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,KAAK;wBACb,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,GAAG;qBACjB,CAAC;oBACJ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC/B,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;QAED,wCAAwC;QAExC,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
package/dist/node/mod.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { Effect, Layer, OtelTracer } from '@livestore/utils/effect';
|
|
|
3
3
|
import * as otel from '@opentelemetry/api';
|
|
4
4
|
export { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
|
|
5
5
|
export { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
6
|
+
export * as FileLogger from './FileLogger.ts';
|
|
6
7
|
export declare const OtelLiveHttp: ({ serviceName, rootSpanName, rootSpanAttributes, parentSpan, skipLogUrl, traceNodeBootstrap, }?: {
|
|
7
8
|
serviceName?: string;
|
|
8
9
|
rootSpanName?: string;
|
package/dist/node/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,EAAmB,MAAM,EAAY,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE9F,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAM1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAE3E,eAAO,MAAM,YAAY,GAAI,iGAO1B;IACD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACxB,KAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,EAAmB,MAAM,EAAY,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE9F,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAM1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAE3E,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C,eAAO,MAAM,YAAY,GAAI,iGAO1B;IACD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACxB,KAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CA8ExC,CAAA;AAEpC,eAAO,MAAM,oBAAoB,GAAI,WAAW,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC,IAAI,oDAazF,CAAA;AAEH,eAAO,MAAM,oBAAoB,GAAI,MAAM,IAAI,CAAC,IAAI,oDAqBhD,CAAA;AAEJ,eAAO,MAAM,GAAG,EAAE,CAChB,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAC7C,OAAO,CAAC,EACJ;IACE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CACzC,GACD,SAAS,KACV,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,aAAa,EAAE,eAAe,CAAC,eAAe,CAyBvG,CAAA;AAEF,eAAO,MAAM,OAAO,EAAE,CACpB,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAC7C,OAAO,CAAC,EAAE;IACR,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CACzC,KACE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,eAAe,CAAC,eAAe,CAwBtF,CAAA"}
|
package/dist/node/mod.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { performance } from 'node:perf_hooks';
|
|
2
2
|
import * as OtelNodeSdk from '@effect/opentelemetry/NodeSdk';
|
|
3
|
-
import { IS_BUN, isNotUndefined, shouldNeverHappen } from '@livestore/utils';
|
|
3
|
+
import { IS_BUN, isNonEmptyString, isNotUndefined, shouldNeverHappen } from '@livestore/utils';
|
|
4
4
|
import { Command, Config, Effect, identity, Layer, OtelTracer } from '@livestore/utils/effect';
|
|
5
5
|
import { OtelLiveDummy } from '@livestore/utils/node';
|
|
6
6
|
import * as otel from '@opentelemetry/api';
|
|
@@ -10,9 +10,10 @@ import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
|
|
|
10
10
|
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
11
11
|
export { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
|
|
12
12
|
export { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
13
|
+
export * as FileLogger from "./FileLogger.js";
|
|
13
14
|
export const OtelLiveHttp = ({ serviceName, rootSpanName, rootSpanAttributes, parentSpan, skipLogUrl, traceNodeBootstrap, } = {}) => Effect.gen(function* () {
|
|
14
15
|
const configRes = yield* Config.all({
|
|
15
|
-
exporterUrl: Config.string('OTEL_EXPORTER_OTLP_ENDPOINT'),
|
|
16
|
+
exporterUrl: Config.string('OTEL_EXPORTER_OTLP_ENDPOINT').pipe(Config.validate({ message: 'OTEL_EXPORTER_OTLP_ENDPOINT must be set', validation: isNonEmptyString })),
|
|
16
17
|
serviceName: serviceName
|
|
17
18
|
? Config.succeed(serviceName)
|
|
18
19
|
: Config.string('OTEL_SERVICE_NAME').pipe(Config.withDefault('livestore-utils-dev')),
|
|
@@ -22,7 +23,7 @@ export const OtelLiveHttp = ({ serviceName, rootSpanName, rootSpanAttributes, pa
|
|
|
22
23
|
}).pipe(Effect.option);
|
|
23
24
|
if (configRes._tag === 'None') {
|
|
24
25
|
const RootSpanLive = Layer.span('DummyRoot', {});
|
|
25
|
-
return RootSpanLive.pipe(Layer.
|
|
26
|
+
return RootSpanLive.pipe(Layer.provideMerge(OtelLiveDummy));
|
|
26
27
|
}
|
|
27
28
|
const config = configRes.value;
|
|
28
29
|
const resource = { serviceName: config.serviceName };
|
package/dist/node/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/node/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAE9F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAE3E,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,kBAAkB,MAQhB,EAAE,EAAwE,EAAE,CAC9E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,IAAI,CAC5D,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CACtG;QACD,WAAW,EAAE,WAAW;YACtB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YAC7B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QACtF,YAAY,EAAE,YAAY;YACxB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YAC9B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;KAC9E,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAEtB,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAChD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,CAAQ,CAAA;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAA;IAE9B,MAAM,QAAQ,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAA;IAEpD,MAAM,YAAY,GAAG,IAAI,6BAA6B,CAAC;QACrD,QAAQ,EAAE,IAAI,kBAAkB,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,aAAa,EAAE,CAAC;QAC7E,oBAAoB,EAAE,IAAI;KAC3B,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,QAAQ;QACR,YAAY;QACZ,aAAa,EAAE,IAAI,kBAAkB,CACnC,IAAI,iBAAiB,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAC9E,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAC7B;KACF,CAAC,CAAC,CAAA;IAEH,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;QACnD,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE;QAC7C,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAChF,MAAM,EAAE,UAAU;KACnB,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEnF,IAAI,kBAAkB,EAAE,CAAC;QACvB;;WAEG;QACH,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;YAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,eAAe,CAAA;YAErD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAA;YAEzC,4FAA4F;YAC5F,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC,SAAS,CAAA;YAE/F,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAC/B,gBAAgB,EAChB;gBACE,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,UAAU,EAAE;oBACV,uBAAuB,EAAE,UAAU,CAAC,SAAS;oBAC7C,yBAAyB,EAAE,UAAU,CAAC,WAAW;oBACjD,+BAA+B,EAAE,UAAU,CAAC,iBAAiB;oBAC7D,uBAAuB,EAAE,UAAU,CAAC,SAAS;oBAC7C,sBAAsB,EAAE,UAAU,CAAC,QAAQ;iBAC5C;aACF,EACD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAC5E,CAAA;YAED,QAAQ,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAQ,CAAA;AAEpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAkC,EAAE,EAAE,CAAC,CAAC,IAAe,EAAE,EAAE,CAC9F,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAA;IAC1D,CAAC;SAAM,CAAC;QACN,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,GAAG,EAAE,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CACH,CAAA;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAe,EAAE,EAAE,CACtD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3F,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;QAAE,OAAM;IAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAA;IAE1C,kBAAkB;IAElB,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAA;IACtC,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;QACvC,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU,EAAE,OAAO;YACnB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC/D,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE;SACrC,CAAC;KACH,CAAC,CAAA;IAEF,gCAAgC;IAChC,OAAO,GAAG,eAAe,YAAY,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAA;AAChE,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,GAAG,GAS6F,MAAM,CAAC,EAAE,CACpH,KAAK,CACN,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,OAAO;IAChC,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IACxG,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEtH,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;SACnD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC,CAAA;IACX,MAAM,eAAe,GAAG,WAAW,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,eAAe,SAAS,GAAG,GAAG,CAAC,CAAA;IAClE,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAExF,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI;IAChD,iDAAiD;IACjD,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,+BAA+B;IACzD,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,kCAAkC;IAC7D,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,kCAAkC;IAC7D,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAC7B,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EACpD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,EAC/B,OAAO,CAAC,QAAQ,EAChB,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,SAAS,CAAC,CAAC,CAAC,CACnG,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAQuE,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAC7G,QAAQ,CAAC,EAAE,YAAY,EAAE,OAAO;IAC9B,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IACxG,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QACpD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC;QACrC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;SACnD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEX,MAAM,eAAe,GAAG,WAAW,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,eAAe,SAAS,GAAG,GAAG,CAAC,CAAA;IAClE,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IAElF,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI;IAChD,oFAAoF;IACpF,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC,EAC5C,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAC7B,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EACzD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,EAC/B,OAAO,CAAC,MAAM,CACf,CAAA;AACH,CAAC,CACF,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/utils-dev",
|
|
3
|
-
"version": "0.3.2-dev.
|
|
3
|
+
"version": "0.3.2-dev.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./dist/node-vitest/polyfill.js"
|
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
"./node": {
|
|
10
10
|
"types": "./dist/node/mod.d.ts",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"bun": "./src/node/mod.ts",
|
|
12
|
+
"default": "./dist/node/mod.js"
|
|
13
13
|
},
|
|
14
14
|
"./node-vitest": {
|
|
15
15
|
"types": "./dist/node-vitest/mod.d.ts",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
16
|
+
"bun": "./src/node-vitest/mod.ts",
|
|
17
|
+
"default": "./dist/node-vitest/mod.js"
|
|
18
18
|
},
|
|
19
19
|
"./node-vitest-polyfill": {
|
|
20
20
|
"types": "./dist/node-vitest/polyfill.d.ts",
|
|
21
|
-
"
|
|
22
|
-
"
|
|
21
|
+
"bun": "./src/node-vitest/polyfill.ts",
|
|
22
|
+
"default": "./dist/node-vitest/polyfill.js"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@opentelemetry/sdk-metrics": "2.0.0",
|
|
32
32
|
"@opentelemetry/sdk-trace-base": "2.0.0",
|
|
33
33
|
"@opentelemetry/sdk-trace-node": "2.0.0",
|
|
34
|
-
"@livestore/utils": "0.3.2-dev.
|
|
34
|
+
"@livestore/utils": "0.3.2-dev.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {},
|
|
37
37
|
"files": [
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import util from 'node:util'
|
|
4
|
+
import {
|
|
5
|
+
Cause,
|
|
6
|
+
Effect,
|
|
7
|
+
FiberId,
|
|
8
|
+
HashMap,
|
|
9
|
+
Inspectable,
|
|
10
|
+
Layer,
|
|
11
|
+
List,
|
|
12
|
+
Logger,
|
|
13
|
+
type LogLevel,
|
|
14
|
+
LogSpan,
|
|
15
|
+
ReadonlyArray,
|
|
16
|
+
} from '@livestore/utils/effect'
|
|
17
|
+
|
|
18
|
+
export const makeFileLogger = (
|
|
19
|
+
logFilePath: string,
|
|
20
|
+
options?: {
|
|
21
|
+
readonly threadName: string
|
|
22
|
+
readonly colors?: boolean
|
|
23
|
+
},
|
|
24
|
+
) =>
|
|
25
|
+
Layer.unwrapScoped(
|
|
26
|
+
Effect.gen(function* () {
|
|
27
|
+
yield* Effect.sync(() => fs.mkdirSync(path.dirname(logFilePath), { recursive: true }))
|
|
28
|
+
|
|
29
|
+
const logFile = yield* Effect.acquireRelease(
|
|
30
|
+
Effect.sync(() => fs.openSync(logFilePath, 'a', 0o666)),
|
|
31
|
+
(fd) => Effect.sync(() => fs.closeSync(fd)),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
return Logger.replace(
|
|
35
|
+
Logger.defaultLogger,
|
|
36
|
+
prettyLoggerTty({
|
|
37
|
+
colors: options?.colors ?? false,
|
|
38
|
+
stderr: false,
|
|
39
|
+
formatDate: (date) => `${defaultDateFormat(date)} ${options?.threadName ?? ''}`,
|
|
40
|
+
onLog: (str) => fs.writeSync(logFile, str),
|
|
41
|
+
}),
|
|
42
|
+
)
|
|
43
|
+
}),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
const withColor = (text: string, ...colors: ReadonlyArray<string>) => {
|
|
47
|
+
let out = ''
|
|
48
|
+
for (let i = 0; i < colors.length; i++) {
|
|
49
|
+
out += `\x1b[${colors[i]}m`
|
|
50
|
+
}
|
|
51
|
+
return `${out}${text}\x1b[0m`
|
|
52
|
+
}
|
|
53
|
+
const withColorNoop = (text: string, ..._colors: ReadonlyArray<string>) => text
|
|
54
|
+
|
|
55
|
+
const colors = {
|
|
56
|
+
bold: '1',
|
|
57
|
+
red: '31',
|
|
58
|
+
green: '32',
|
|
59
|
+
yellow: '33',
|
|
60
|
+
blue: '34',
|
|
61
|
+
cyan: '36',
|
|
62
|
+
white: '37',
|
|
63
|
+
gray: '90',
|
|
64
|
+
black: '30',
|
|
65
|
+
bgBrightRed: '101',
|
|
66
|
+
} as const
|
|
67
|
+
|
|
68
|
+
const logLevelColors: Record<LogLevel.LogLevel['_tag'], ReadonlyArray<string>> = {
|
|
69
|
+
None: [],
|
|
70
|
+
All: [],
|
|
71
|
+
Trace: [colors.gray],
|
|
72
|
+
Debug: [colors.blue],
|
|
73
|
+
Info: [colors.green],
|
|
74
|
+
Warning: [colors.yellow],
|
|
75
|
+
Error: [colors.red],
|
|
76
|
+
Fatal: [colors.bgBrightRed, colors.black],
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const defaultDateFormat = (date: Date): string =>
|
|
80
|
+
`${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date
|
|
81
|
+
.getSeconds()
|
|
82
|
+
.toString()
|
|
83
|
+
.padStart(2, '0')}.${date.getMilliseconds().toString().padStart(3, '0')}`
|
|
84
|
+
|
|
85
|
+
export const structuredMessage = (u: unknown): unknown => {
|
|
86
|
+
switch (typeof u) {
|
|
87
|
+
case 'bigint':
|
|
88
|
+
case 'function':
|
|
89
|
+
case 'symbol': {
|
|
90
|
+
return String(u)
|
|
91
|
+
}
|
|
92
|
+
default: {
|
|
93
|
+
return Inspectable.toJSON(u)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const consoleLogToString = (...s: any[]) => {
|
|
99
|
+
if (s.length === 0) return ''
|
|
100
|
+
const [first, ...rest] = s
|
|
101
|
+
if (typeof first === 'string') {
|
|
102
|
+
return rest.length > 0 ? util.format(first, ...rest.map(structuredMessage)) : first
|
|
103
|
+
}
|
|
104
|
+
return s
|
|
105
|
+
.map((v) => {
|
|
106
|
+
if (typeof v === 'string') return v
|
|
107
|
+
return util.inspect(structuredMessage(v), {
|
|
108
|
+
depth: 3,
|
|
109
|
+
colors: false,
|
|
110
|
+
compact: false,
|
|
111
|
+
breakLength: 120,
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
.join(' ')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export const prettyLoggerTty = (options: {
|
|
118
|
+
readonly colors: boolean
|
|
119
|
+
readonly stderr: boolean
|
|
120
|
+
readonly formatDate: (date: Date) => string
|
|
121
|
+
readonly onLog?: (str: string) => void
|
|
122
|
+
}) => {
|
|
123
|
+
const color = options.colors ? withColor : withColorNoop
|
|
124
|
+
return Logger.make<unknown, string>(({ annotations, cause, date, fiberId, logLevel, message: message_, spans }) => {
|
|
125
|
+
let str = ''
|
|
126
|
+
|
|
127
|
+
const log = (...s: any[]) => {
|
|
128
|
+
str += `${consoleLogToString(...s)}\n`
|
|
129
|
+
options.onLog?.(str)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const logIndented = (...s: any[]) => {
|
|
133
|
+
str += `${consoleLogToString(...s).replace(/^/gm, ' ')}\n`
|
|
134
|
+
options.onLog?.(str)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const message = ReadonlyArray.ensure(message_)
|
|
138
|
+
|
|
139
|
+
let firstLine =
|
|
140
|
+
color(`[${options.formatDate(date)}]`, colors.white) +
|
|
141
|
+
` ${color(logLevel.label, ...logLevelColors[logLevel._tag])}` +
|
|
142
|
+
` (${FiberId.threadName(fiberId)})`
|
|
143
|
+
|
|
144
|
+
if (List.isCons(spans)) {
|
|
145
|
+
const now = date.getTime()
|
|
146
|
+
const render = LogSpan.render(now)
|
|
147
|
+
for (const span of spans) {
|
|
148
|
+
firstLine += ` ${render(span)}`
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
firstLine += ':'
|
|
153
|
+
let messageIndex = 0
|
|
154
|
+
if (message.length > 0) {
|
|
155
|
+
const firstMaybeString = structuredMessage(message[0])
|
|
156
|
+
if (typeof firstMaybeString === 'string') {
|
|
157
|
+
firstLine += ` ${color(firstMaybeString, colors.bold, colors.cyan)}`
|
|
158
|
+
messageIndex++
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
log(firstLine)
|
|
163
|
+
// if (!processIsBun) console.group()
|
|
164
|
+
|
|
165
|
+
if (!Cause.isEmpty(cause)) {
|
|
166
|
+
logIndented(Cause.pretty(cause, { renderErrorCause: true }))
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (messageIndex < message.length) {
|
|
170
|
+
for (; messageIndex < message.length; messageIndex++) {
|
|
171
|
+
const msg = message[messageIndex]
|
|
172
|
+
if (typeof msg === 'object' && msg !== null) {
|
|
173
|
+
logIndented(
|
|
174
|
+
util.inspect(structuredMessage(msg), {
|
|
175
|
+
depth: 3,
|
|
176
|
+
colors: false,
|
|
177
|
+
compact: false,
|
|
178
|
+
breakLength: 120,
|
|
179
|
+
}),
|
|
180
|
+
)
|
|
181
|
+
} else {
|
|
182
|
+
logIndented(Inspectable.redact(msg))
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (HashMap.size(annotations) > 0) {
|
|
188
|
+
for (const [key, value] of annotations) {
|
|
189
|
+
const formattedValue =
|
|
190
|
+
typeof value === 'object' && value !== null
|
|
191
|
+
? util.inspect(structuredMessage(value), {
|
|
192
|
+
depth: 3,
|
|
193
|
+
colors: false,
|
|
194
|
+
compact: false,
|
|
195
|
+
breakLength: 120,
|
|
196
|
+
})
|
|
197
|
+
: Inspectable.redact(value)
|
|
198
|
+
logIndented(color(`${key}:`, colors.bold, colors.white), formattedValue)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// if (!processIsBun) console.groupEnd()
|
|
203
|
+
|
|
204
|
+
return str
|
|
205
|
+
})
|
|
206
|
+
}
|
package/src/node/mod.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { performance } from 'node:perf_hooks'
|
|
2
2
|
|
|
3
3
|
import * as OtelNodeSdk from '@effect/opentelemetry/NodeSdk'
|
|
4
|
-
import { IS_BUN, isNotUndefined, shouldNeverHappen } from '@livestore/utils'
|
|
4
|
+
import { IS_BUN, isNonEmptyString, isNotUndefined, shouldNeverHappen } from '@livestore/utils'
|
|
5
5
|
import type { CommandExecutor, PlatformError, Tracer } from '@livestore/utils/effect'
|
|
6
6
|
import { Command, Config, Effect, identity, Layer, OtelTracer } from '@livestore/utils/effect'
|
|
7
7
|
import { OtelLiveDummy } from '@livestore/utils/node'
|
|
@@ -14,6 +14,8 @@ import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
|
|
|
14
14
|
export { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'
|
|
15
15
|
export { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
|
|
16
16
|
|
|
17
|
+
export * as FileLogger from './FileLogger.ts'
|
|
18
|
+
|
|
17
19
|
export const OtelLiveHttp = ({
|
|
18
20
|
serviceName,
|
|
19
21
|
rootSpanName,
|
|
@@ -31,7 +33,9 @@ export const OtelLiveHttp = ({
|
|
|
31
33
|
} = {}): Layer.Layer<OtelTracer.OtelTracer | Tracer.ParentSpan, never, never> =>
|
|
32
34
|
Effect.gen(function* () {
|
|
33
35
|
const configRes = yield* Config.all({
|
|
34
|
-
exporterUrl: Config.string('OTEL_EXPORTER_OTLP_ENDPOINT')
|
|
36
|
+
exporterUrl: Config.string('OTEL_EXPORTER_OTLP_ENDPOINT').pipe(
|
|
37
|
+
Config.validate({ message: 'OTEL_EXPORTER_OTLP_ENDPOINT must be set', validation: isNonEmptyString }),
|
|
38
|
+
),
|
|
35
39
|
serviceName: serviceName
|
|
36
40
|
? Config.succeed(serviceName)
|
|
37
41
|
: Config.string('OTEL_SERVICE_NAME').pipe(Config.withDefault('livestore-utils-dev')),
|
|
@@ -42,7 +46,7 @@ export const OtelLiveHttp = ({
|
|
|
42
46
|
|
|
43
47
|
if (configRes._tag === 'None') {
|
|
44
48
|
const RootSpanLive = Layer.span('DummyRoot', {})
|
|
45
|
-
return RootSpanLive.pipe(Layer.
|
|
49
|
+
return RootSpanLive.pipe(Layer.provideMerge(OtelLiveDummy)) as any
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
const config = configRes.value
|