loggily 0.6.0 → 0.6.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 +70 -90
- package/dist/index.d.mts +333 -4
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +733 -3
- package/dist/index.mjs.map +1 -0
- package/package.json +22 -39
- package/dist/context.d.mts +0 -91
- package/dist/context.d.mts.map +0 -1
- package/dist/context.mjs +0 -145
- package/dist/context.mjs.map +0 -1
- package/dist/core-7D7sstHl.d.mts +0 -239
- package/dist/core-7D7sstHl.d.mts.map +0 -1
- package/dist/core-BDFU50FQ.mjs +0 -570
- package/dist/core-BDFU50FQ.mjs.map +0 -1
- package/dist/file-writer-BuQGFGRs.d.mts +0 -46
- package/dist/file-writer-BuQGFGRs.d.mts.map +0 -1
- package/dist/file-writer.d.mts +0 -2
- package/dist/file-writer.mjs +0 -75
- package/dist/file-writer.mjs.map +0 -1
- package/dist/metrics.d.mts +0 -48
- package/dist/metrics.d.mts.map +0 -1
- package/dist/metrics.mjs +0 -130
- package/dist/metrics.mjs.map +0 -1
- package/dist/tracing-2kv3HZ07.d.mts +0 -65
- package/dist/tracing-2kv3HZ07.d.mts.map +0 -1
- package/dist/tracing.d.mts +0 -2
- package/dist/tracing.mjs +0 -96
- package/dist/tracing.mjs.map +0 -1
- package/dist/worker.d.mts +0 -173
- package/dist/worker.d.mts.map +0 -1
- package/dist/worker.mjs +0 -468
- package/dist/worker.mjs.map +0 -1
- package/src/colors.ts +0 -27
- package/src/context.ts +0 -170
- package/src/core.ts +0 -880
- package/src/file-writer.ts +0 -110
- package/src/index.browser.ts +0 -72
- package/src/index.ts +0 -18
- package/src/metrics.ts +0 -201
- package/src/tracing.ts +0 -150
- package/src/worker.ts +0 -674
package/dist/worker.d.mts
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { o as Logger } from "./core-7D7sstHl.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/worker.d.ts
|
|
4
|
-
/** Message sent from worker to main thread for console output */
|
|
5
|
-
interface WorkerConsoleMessage {
|
|
6
|
-
type: "console";
|
|
7
|
-
level: "log" | "debug" | "info" | "warn" | "error" | "trace";
|
|
8
|
-
namespace?: string;
|
|
9
|
-
args: unknown[];
|
|
10
|
-
timestamp: number;
|
|
11
|
-
}
|
|
12
|
-
/** Message sent from worker to main thread for structured log output */
|
|
13
|
-
interface WorkerLogMessage {
|
|
14
|
-
type: "log";
|
|
15
|
-
level: "trace" | "debug" | "info" | "warn" | "error";
|
|
16
|
-
namespace: string;
|
|
17
|
-
message: string;
|
|
18
|
-
data?: Record<string, unknown>;
|
|
19
|
-
timestamp: number;
|
|
20
|
-
}
|
|
21
|
-
/** Message sent from worker to main thread for span events */
|
|
22
|
-
interface WorkerSpanMessage {
|
|
23
|
-
type: "span";
|
|
24
|
-
event: "start" | "end";
|
|
25
|
-
namespace: string;
|
|
26
|
-
spanId: string;
|
|
27
|
-
traceId: string;
|
|
28
|
-
parentId: string | null;
|
|
29
|
-
startTime: number;
|
|
30
|
-
endTime?: number;
|
|
31
|
-
duration?: number;
|
|
32
|
-
props: Record<string, unknown>;
|
|
33
|
-
spanData: Record<string, unknown>;
|
|
34
|
-
timestamp: number;
|
|
35
|
-
}
|
|
36
|
-
/** Union type for all worker messages */
|
|
37
|
-
type WorkerMessage = WorkerConsoleMessage | WorkerLogMessage | WorkerSpanMessage;
|
|
38
|
-
/** Type guard for WorkerConsoleMessage */
|
|
39
|
-
declare function isWorkerConsoleMessage(msg: unknown): msg is WorkerConsoleMessage;
|
|
40
|
-
/** Type guard for WorkerLogMessage */
|
|
41
|
-
declare function isWorkerLogMessage(msg: unknown): msg is WorkerLogMessage;
|
|
42
|
-
/** Type guard for WorkerSpanMessage */
|
|
43
|
-
declare function isWorkerSpanMessage(msg: unknown): msg is WorkerSpanMessage;
|
|
44
|
-
/** Type guard for any worker message */
|
|
45
|
-
declare function isWorkerMessage(msg: unknown): msg is WorkerMessage;
|
|
46
|
-
type PostMessageFn = (message: WorkerConsoleMessage) => void;
|
|
47
|
-
/**
|
|
48
|
-
* Forward console.* calls from worker to main thread.
|
|
49
|
-
*
|
|
50
|
-
* Monkey-patches console methods to send messages via postMessage.
|
|
51
|
-
* Call this at the start of your worker script.
|
|
52
|
-
*
|
|
53
|
-
* @param postMessage - The worker's postMessage function
|
|
54
|
-
* @param namespace - Optional namespace for log messages (e.g., "km:worker:parse")
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* ```typescript
|
|
58
|
-
* // At top of worker file:
|
|
59
|
-
* import { forwardConsole } from "loggily/worker"
|
|
60
|
-
* forwardConsole(postMessage, "km:worker:parse")
|
|
61
|
-
*
|
|
62
|
-
* // Now all console.* calls are forwarded:
|
|
63
|
-
* console.log("processing", { file: "test.md" })
|
|
64
|
-
* console.error(new Error("failed"))
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
declare function forwardConsole(postMessage: PostMessageFn, namespace?: string): void;
|
|
68
|
-
/**
|
|
69
|
-
* Restore original console methods.
|
|
70
|
-
* Call this if you need to disable console forwarding.
|
|
71
|
-
*/
|
|
72
|
-
declare function restoreConsole(): void;
|
|
73
|
-
type PostMessageAnyFn = (message: WorkerMessage) => void;
|
|
74
|
-
/** Reset worker ID counters (for testing) */
|
|
75
|
-
declare function resetWorkerIds(): void;
|
|
76
|
-
interface WorkerLoggerOptions {
|
|
77
|
-
/** Parent span ID for nested spans */
|
|
78
|
-
parentSpanId?: string | null;
|
|
79
|
-
/** Trace ID for distributed tracing */
|
|
80
|
-
traceId?: string | null;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Create a logger instance for use in a worker thread.
|
|
84
|
-
*
|
|
85
|
-
* All log calls and span events are forwarded to the main thread via postMessage.
|
|
86
|
-
* The main thread should use createWorkerLogHandler to process these messages.
|
|
87
|
-
*
|
|
88
|
-
* @param postMessage - The worker's postMessage function
|
|
89
|
-
* @param namespace - Logger namespace (e.g., "km:worker:parse")
|
|
90
|
-
* @param props - Optional initial props
|
|
91
|
-
* @param options - Optional configuration
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```typescript
|
|
95
|
-
* import { createWorkerLogger } from "loggily/worker"
|
|
96
|
-
*
|
|
97
|
-
* const log = createWorkerLogger(postMessage, "km:worker:parse")
|
|
98
|
-
*
|
|
99
|
-
* log.info("starting parse", { file: "test.md" })
|
|
100
|
-
*
|
|
101
|
-
* {
|
|
102
|
-
* using span = log.span("process")
|
|
103
|
-
* span.info("processing...")
|
|
104
|
-
* span.spanData.lineCount = 100
|
|
105
|
-
* }
|
|
106
|
-
* // Span end event automatically sent to main thread
|
|
107
|
-
* ```
|
|
108
|
-
*/
|
|
109
|
-
declare function createWorkerLogger(postMessage: PostMessageAnyFn, namespace: string, props?: Record<string, unknown>, options?: WorkerLoggerOptions): Logger;
|
|
110
|
-
interface WorkerConsoleHandlerOptions {
|
|
111
|
-
/** Default namespace if message doesn't include one */
|
|
112
|
-
defaultNamespace?: string;
|
|
113
|
-
/** Custom logger to use (defaults to creating one with the namespace) */
|
|
114
|
-
logger?: Logger;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Create a handler for worker console messages.
|
|
118
|
-
*
|
|
119
|
-
* Use this on the main thread to receive and output messages from workers.
|
|
120
|
-
*
|
|
121
|
-
* @param options - Handler options
|
|
122
|
-
* @returns Handler function to call with worker messages
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* ```typescript
|
|
126
|
-
* import { createWorkerConsoleHandler } from "loggily/worker"
|
|
127
|
-
*
|
|
128
|
-
* const handleConsole = createWorkerConsoleHandler({
|
|
129
|
-
* defaultNamespace: "km:worker:parse"
|
|
130
|
-
* })
|
|
131
|
-
*
|
|
132
|
-
* worker.onmessage = (e) => {
|
|
133
|
-
* if (e.data.type === "console") {
|
|
134
|
-
* handleConsole(e.data)
|
|
135
|
-
* } else {
|
|
136
|
-
* // Handle other message types
|
|
137
|
-
* }
|
|
138
|
-
* }
|
|
139
|
-
* ```
|
|
140
|
-
*/
|
|
141
|
-
declare function createWorkerConsoleHandler(options?: WorkerConsoleHandlerOptions): (message: WorkerConsoleMessage) => void;
|
|
142
|
-
interface WorkerLogHandlerOptions {
|
|
143
|
-
/** Enable span output (default: uses spansAreEnabled()) */
|
|
144
|
-
enableSpans?: boolean;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Create a handler for worker logger messages (logs and spans).
|
|
148
|
-
*
|
|
149
|
-
* Use this on the main thread to receive and output messages from workers
|
|
150
|
-
* that use createWorkerLogger.
|
|
151
|
-
*
|
|
152
|
-
* @param options - Handler options
|
|
153
|
-
* @returns Handler function to call with worker messages
|
|
154
|
-
*
|
|
155
|
-
* @example
|
|
156
|
-
* ```typescript
|
|
157
|
-
* import { createWorkerLogHandler, isWorkerMessage } from "loggily/worker"
|
|
158
|
-
*
|
|
159
|
-
* const handleLog = createWorkerLogHandler()
|
|
160
|
-
*
|
|
161
|
-
* worker.onmessage = (e) => {
|
|
162
|
-
* if (isWorkerMessage(e.data)) {
|
|
163
|
-
* handleLog(e.data)
|
|
164
|
-
* } else {
|
|
165
|
-
* // Handle other message types
|
|
166
|
-
* }
|
|
167
|
-
* }
|
|
168
|
-
* ```
|
|
169
|
-
*/
|
|
170
|
-
declare function createWorkerLogHandler(options?: WorkerLogHandlerOptions): (message: WorkerMessage) => void;
|
|
171
|
-
//#endregion
|
|
172
|
-
export { WorkerConsoleHandlerOptions, WorkerConsoleMessage, WorkerLogHandlerOptions, WorkerLogMessage, WorkerMessage, WorkerSpanMessage, createWorkerConsoleHandler, createWorkerLogHandler, createWorkerLogger, forwardConsole, isWorkerConsoleMessage, isWorkerLogMessage, isWorkerMessage, isWorkerSpanMessage, resetWorkerIds, restoreConsole };
|
|
173
|
-
//# sourceMappingURL=worker.d.mts.map
|
package/dist/worker.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.mts","names":[],"sources":["../src/worker.ts"],"mappings":";;;;UAyDiB,oBAAA;EACf,IAAA;EACA,KAAA;EACA,SAAA;EACA,IAAA;EACA,SAAA;AAAA;;UAIe,gBAAA;EACf,IAAA;EACA,KAAA;EACA,SAAA;EACA,OAAA;EACA,IAAA,GAAO,MAAA;EACP,SAAA;AAAA;;UAIe,iBAAA;EACf,IAAA;EACA,KAAA;EACA,SAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;EACA,KAAA,EAAO,MAAA;EACP,QAAA,EAAU,MAAA;EACV,SAAA;AAAA;;KAIU,aAAA,GAAgB,oBAAA,GAAuB,gBAAA,GAAmB,iBAAA;;iBAGtD,sBAAA,CAAuB,GAAA,YAAe,GAAA,IAAO,oBAAA;AAoB7D;AAAA,iBAVgB,kBAAA,CAAmB,GAAA,YAAe,GAAA,IAAO,gBAAA;;iBAUzC,mBAAA,CAAoB,GAAA,YAAe,GAAA,IAAO,iBAAA;;iBAS1C,eAAA,CAAgB,GAAA,YAAe,GAAA,IAAO,aAAA;AAAA,KAMjD,aAAA,IAAiB,OAAA,EAAS,oBAAA;;;AAN/B;;;;;;;;;AAEC;;;;;AA+ED;;;;iBAAgB,cAAA,CAAe,WAAA,EAAa,aAAA,EAAe,SAAA;;;;;iBAiC3C,cAAA,CAAA;AAAA,KASX,gBAAA,IAAoB,OAAA,EAAS,aAAA;;iBAclB,cAAA,CAAA;AAAA,UAKN,mBAAA;EAnBL;EAqBH,YAAA;;EAEA,OAAA;AAAA;AATF;;;;;AAGC;;;;;AAoCD;;;;;;;;;;;;;;;;;AAvCA,iBAuCgB,kBAAA,CACd,WAAA,EAAa,gBAAA,EACb,SAAA,UACA,KAAA,GAAO,MAAA,mBACP,OAAA,GAAS,mBAAA,GACR,MAAA;AAAA,UA2Lc,2BAAA;EAAA;EAEf,gBAAA;;EAEA,MAAA,GAAS,MAAA;AAAA;;;;;AAkFX;;;;;;;;;;AAyBA;;;;;AA6BA;;;;;;iBAtDgB,0BAAA,CACd,OAAA,GAAS,2BAAA,IACP,OAAA,EAAS,oBAAA;AAAA,UAuBI,uBAAA;EA6BqF;EA3BpG,WAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;iBA2Bc,sBAAA,CAAuB,OAAA,GAAS,uBAAA,IAAgC,OAAA,EAAS,aAAA"}
|
package/dist/worker.mjs
DELETED
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
import { D as writeSpan, c as createSpanDataProxy, s as createLogger, u as enableSpans } from "./core-BDFU50FQ.mjs";
|
|
2
|
-
import "./index.mjs";
|
|
3
|
-
//#region src/worker.ts
|
|
4
|
-
/**
|
|
5
|
-
* Worker Thread Logger/Console Forwarding
|
|
6
|
-
*
|
|
7
|
-
* Provides utilities to forward loggily and console.* output from worker threads
|
|
8
|
-
* to the main thread, ensuring proper integration with DEBUG_LOG and log files.
|
|
9
|
-
*
|
|
10
|
-
* ## Full Logger Forwarding (Recommended)
|
|
11
|
-
*
|
|
12
|
-
* @example Worker side:
|
|
13
|
-
* ```typescript
|
|
14
|
-
* import { createWorkerLogger } from "loggily/worker"
|
|
15
|
-
* const log = createWorkerLogger(postMessage, "km:worker:parse")
|
|
16
|
-
*
|
|
17
|
-
* log.info("processing", { file: "test.md" })
|
|
18
|
-
* {
|
|
19
|
-
* using span = log.span("parse")
|
|
20
|
-
* // ... work ...
|
|
21
|
-
* span.spanData.lines = 100
|
|
22
|
-
* }
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example Main thread side:
|
|
26
|
-
* ```typescript
|
|
27
|
-
* import { createWorkerLogHandler } from "loggily/worker"
|
|
28
|
-
*
|
|
29
|
-
* const handleLog = createWorkerLogHandler()
|
|
30
|
-
* worker.onmessage = (e) => {
|
|
31
|
-
* if (e.data.type === "log" || e.data.type === "span") handleLog(e.data)
|
|
32
|
-
* }
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* ## Console Forwarding (Simple)
|
|
36
|
-
*
|
|
37
|
-
* @example Worker side:
|
|
38
|
-
* ```typescript
|
|
39
|
-
* import { forwardConsole } from "loggily/worker"
|
|
40
|
-
* forwardConsole(postMessage)
|
|
41
|
-
*
|
|
42
|
-
* console.log("message") // Forwarded to main thread
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
/** Type guard for WorkerConsoleMessage */
|
|
46
|
-
function isWorkerConsoleMessage(msg) {
|
|
47
|
-
return typeof msg === "object" && msg?.type === "console" && typeof msg.level === "string" && Array.isArray(msg.args);
|
|
48
|
-
}
|
|
49
|
-
/** Type guard for WorkerLogMessage */
|
|
50
|
-
function isWorkerLogMessage(msg) {
|
|
51
|
-
return typeof msg === "object" && msg?.type === "log" && typeof msg.level === "string" && typeof msg.namespace === "string";
|
|
52
|
-
}
|
|
53
|
-
/** Type guard for WorkerSpanMessage */
|
|
54
|
-
function isWorkerSpanMessage(msg) {
|
|
55
|
-
return typeof msg === "object" && msg?.type === "span" && typeof msg.event === "string";
|
|
56
|
-
}
|
|
57
|
-
/** Type guard for any worker message */
|
|
58
|
-
function isWorkerMessage(msg) {
|
|
59
|
-
return isWorkerConsoleMessage(msg) || isWorkerLogMessage(msg) || isWorkerSpanMessage(msg);
|
|
60
|
-
}
|
|
61
|
-
/** Store original console methods for restoration */
|
|
62
|
-
let originalConsole = null;
|
|
63
|
-
/**
|
|
64
|
-
* Serialize a value for transmission via postMessage.
|
|
65
|
-
* Handles non-serializable values like functions and circular references.
|
|
66
|
-
*/
|
|
67
|
-
function serializeArg(arg, depth = 0) {
|
|
68
|
-
if (depth > 5) return "[max depth]";
|
|
69
|
-
if (arg === null || arg === void 0) return arg;
|
|
70
|
-
if (typeof arg === "function") return `[Function: ${arg.name || "anonymous"}]`;
|
|
71
|
-
if (typeof arg === "symbol") return arg.toString();
|
|
72
|
-
if (typeof arg === "bigint") return arg.toString() + "n";
|
|
73
|
-
if (arg instanceof Error) return {
|
|
74
|
-
name: arg.name,
|
|
75
|
-
message: arg.message,
|
|
76
|
-
stack: arg.stack
|
|
77
|
-
};
|
|
78
|
-
if (Array.isArray(arg)) return arg.map((v) => serializeArg(v, depth + 1));
|
|
79
|
-
if (typeof arg === "object") try {
|
|
80
|
-
structuredClone(arg);
|
|
81
|
-
return arg;
|
|
82
|
-
} catch {
|
|
83
|
-
const result = {};
|
|
84
|
-
const seen = /* @__PURE__ */ new Set();
|
|
85
|
-
seen.add(arg);
|
|
86
|
-
for (const [key, value] of Object.entries(arg)) if (typeof value === "object" && value !== null && seen.has(value)) result[key] = "[Circular]";
|
|
87
|
-
else result[key] = serializeArg(value, depth + 1);
|
|
88
|
-
return result;
|
|
89
|
-
}
|
|
90
|
-
return arg;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Forward console.* calls from worker to main thread.
|
|
94
|
-
*
|
|
95
|
-
* Monkey-patches console methods to send messages via postMessage.
|
|
96
|
-
* Call this at the start of your worker script.
|
|
97
|
-
*
|
|
98
|
-
* @param postMessage - The worker's postMessage function
|
|
99
|
-
* @param namespace - Optional namespace for log messages (e.g., "km:worker:parse")
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```typescript
|
|
103
|
-
* // At top of worker file:
|
|
104
|
-
* import { forwardConsole } from "loggily/worker"
|
|
105
|
-
* forwardConsole(postMessage, "km:worker:parse")
|
|
106
|
-
*
|
|
107
|
-
* // Now all console.* calls are forwarded:
|
|
108
|
-
* console.log("processing", { file: "test.md" })
|
|
109
|
-
* console.error(new Error("failed"))
|
|
110
|
-
* ```
|
|
111
|
-
*/
|
|
112
|
-
function forwardConsole(postMessage, namespace) {
|
|
113
|
-
if (!originalConsole) originalConsole = { ...console };
|
|
114
|
-
for (const level of [
|
|
115
|
-
"log",
|
|
116
|
-
"debug",
|
|
117
|
-
"info",
|
|
118
|
-
"warn",
|
|
119
|
-
"error",
|
|
120
|
-
"trace"
|
|
121
|
-
]) console[level] = (...args) => {
|
|
122
|
-
const serializedArgs = args.map((arg) => serializeArg(arg));
|
|
123
|
-
try {
|
|
124
|
-
postMessage({
|
|
125
|
-
type: "console",
|
|
126
|
-
level,
|
|
127
|
-
namespace,
|
|
128
|
-
args: serializedArgs,
|
|
129
|
-
timestamp: Date.now()
|
|
130
|
-
});
|
|
131
|
-
} catch {
|
|
132
|
-
originalConsole?.[level](...args);
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Restore original console methods.
|
|
138
|
-
* Call this if you need to disable console forwarding.
|
|
139
|
-
*/
|
|
140
|
-
function restoreConsole() {
|
|
141
|
-
if (originalConsole) {
|
|
142
|
-
Object.assign(console, originalConsole);
|
|
143
|
-
originalConsole = null;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
let workerSpanIdCounter = 0;
|
|
147
|
-
let workerTraceIdCounter = 0;
|
|
148
|
-
function generateWorkerSpanId() {
|
|
149
|
-
return `wsp_${(++workerSpanIdCounter).toString(36)}`;
|
|
150
|
-
}
|
|
151
|
-
function generateWorkerTraceId() {
|
|
152
|
-
return `wtr_${(++workerTraceIdCounter).toString(36)}`;
|
|
153
|
-
}
|
|
154
|
-
/** Reset worker ID counters (for testing) */
|
|
155
|
-
function resetWorkerIds() {
|
|
156
|
-
workerSpanIdCounter = 0;
|
|
157
|
-
workerTraceIdCounter = 0;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Create a logger instance for use in a worker thread.
|
|
161
|
-
*
|
|
162
|
-
* All log calls and span events are forwarded to the main thread via postMessage.
|
|
163
|
-
* The main thread should use createWorkerLogHandler to process these messages.
|
|
164
|
-
*
|
|
165
|
-
* @param postMessage - The worker's postMessage function
|
|
166
|
-
* @param namespace - Logger namespace (e.g., "km:worker:parse")
|
|
167
|
-
* @param props - Optional initial props
|
|
168
|
-
* @param options - Optional configuration
|
|
169
|
-
*
|
|
170
|
-
* @example
|
|
171
|
-
* ```typescript
|
|
172
|
-
* import { createWorkerLogger } from "loggily/worker"
|
|
173
|
-
*
|
|
174
|
-
* const log = createWorkerLogger(postMessage, "km:worker:parse")
|
|
175
|
-
*
|
|
176
|
-
* log.info("starting parse", { file: "test.md" })
|
|
177
|
-
*
|
|
178
|
-
* {
|
|
179
|
-
* using span = log.span("process")
|
|
180
|
-
* span.info("processing...")
|
|
181
|
-
* span.spanData.lineCount = 100
|
|
182
|
-
* }
|
|
183
|
-
* // Span end event automatically sent to main thread
|
|
184
|
-
* ```
|
|
185
|
-
*/
|
|
186
|
-
function createWorkerLogger(postMessage, namespace, props = {}, options = {}) {
|
|
187
|
-
const { parentSpanId = null, traceId = null } = options;
|
|
188
|
-
function log(level, message, data) {
|
|
189
|
-
const resolved = typeof message === "function" ? message() : message;
|
|
190
|
-
try {
|
|
191
|
-
postMessage({
|
|
192
|
-
type: "log",
|
|
193
|
-
level,
|
|
194
|
-
namespace,
|
|
195
|
-
message: resolved,
|
|
196
|
-
data: data ? {
|
|
197
|
-
...props,
|
|
198
|
-
...data
|
|
199
|
-
} : Object.keys(props).length > 0 ? props : void 0,
|
|
200
|
-
timestamp: Date.now()
|
|
201
|
-
});
|
|
202
|
-
} catch (err) {
|
|
203
|
-
try {
|
|
204
|
-
postMessage({
|
|
205
|
-
type: "log",
|
|
206
|
-
level: "error",
|
|
207
|
-
namespace,
|
|
208
|
-
message: `postMessage failed for ${level} "${resolved}": ${err instanceof Error ? err.message : String(err)}`,
|
|
209
|
-
timestamp: Date.now()
|
|
210
|
-
});
|
|
211
|
-
} catch {}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
function createSpan(spanNamespace, spanProps) {
|
|
215
|
-
const fullNamespace = spanNamespace ? `${namespace}:${spanNamespace}` : namespace;
|
|
216
|
-
const mergedProps = {
|
|
217
|
-
...props,
|
|
218
|
-
...spanProps
|
|
219
|
-
};
|
|
220
|
-
const spanId = generateWorkerSpanId();
|
|
221
|
-
const spanTraceId = traceId || generateWorkerTraceId();
|
|
222
|
-
const startTime = Date.now();
|
|
223
|
-
const customSpanData = {};
|
|
224
|
-
try {
|
|
225
|
-
postMessage({
|
|
226
|
-
type: "span",
|
|
227
|
-
event: "start",
|
|
228
|
-
namespace: fullNamespace,
|
|
229
|
-
spanId,
|
|
230
|
-
traceId: spanTraceId,
|
|
231
|
-
parentId: parentSpanId,
|
|
232
|
-
startTime,
|
|
233
|
-
props: mergedProps,
|
|
234
|
-
spanData: {},
|
|
235
|
-
timestamp: Date.now()
|
|
236
|
-
});
|
|
237
|
-
} catch (err) {
|
|
238
|
-
try {
|
|
239
|
-
postMessage({
|
|
240
|
-
type: "log",
|
|
241
|
-
level: "error",
|
|
242
|
-
namespace: fullNamespace,
|
|
243
|
-
message: `postMessage failed for span start "${fullNamespace}": ${err instanceof Error ? err.message : String(err)}`,
|
|
244
|
-
timestamp: Date.now()
|
|
245
|
-
});
|
|
246
|
-
} catch {}
|
|
247
|
-
}
|
|
248
|
-
let ended = false;
|
|
249
|
-
const spanData = createSpanDataProxy(() => ({
|
|
250
|
-
id: spanId,
|
|
251
|
-
traceId: spanTraceId,
|
|
252
|
-
parentId: parentSpanId,
|
|
253
|
-
startTime,
|
|
254
|
-
endTime: ended ? Date.now() : null,
|
|
255
|
-
duration: Date.now() - startTime
|
|
256
|
-
}), customSpanData);
|
|
257
|
-
function endSpan() {
|
|
258
|
-
if (ended) return;
|
|
259
|
-
ended = true;
|
|
260
|
-
const endTime = Date.now();
|
|
261
|
-
const duration = endTime - startTime;
|
|
262
|
-
try {
|
|
263
|
-
postMessage({
|
|
264
|
-
type: "span",
|
|
265
|
-
event: "end",
|
|
266
|
-
namespace: fullNamespace,
|
|
267
|
-
spanId,
|
|
268
|
-
traceId: spanTraceId,
|
|
269
|
-
parentId: parentSpanId,
|
|
270
|
-
startTime,
|
|
271
|
-
endTime,
|
|
272
|
-
duration,
|
|
273
|
-
props: mergedProps,
|
|
274
|
-
spanData: customSpanData,
|
|
275
|
-
timestamp: Date.now()
|
|
276
|
-
});
|
|
277
|
-
} catch (err) {
|
|
278
|
-
try {
|
|
279
|
-
postMessage({
|
|
280
|
-
type: "log",
|
|
281
|
-
level: "error",
|
|
282
|
-
namespace: fullNamespace,
|
|
283
|
-
message: `postMessage failed for span end "${fullNamespace}" (${duration}ms): ${err instanceof Error ? err.message : String(err)}`,
|
|
284
|
-
timestamp: Date.now()
|
|
285
|
-
});
|
|
286
|
-
} catch {}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
return {
|
|
290
|
-
...createWorkerLogger(postMessage, fullNamespace, mergedProps, {
|
|
291
|
-
parentSpanId: spanId,
|
|
292
|
-
traceId: spanTraceId
|
|
293
|
-
}),
|
|
294
|
-
spanData,
|
|
295
|
-
end: endSpan,
|
|
296
|
-
[Symbol.dispose]: endSpan
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
return {
|
|
300
|
-
name: namespace,
|
|
301
|
-
props: Object.freeze({ ...props }),
|
|
302
|
-
spanData: null,
|
|
303
|
-
trace: (msg, data) => log("trace", msg, data),
|
|
304
|
-
debug: (msg, data) => log("debug", msg, data),
|
|
305
|
-
info: (msg, data) => log("info", msg, data),
|
|
306
|
-
warn: (msg, data) => log("warn", msg, data),
|
|
307
|
-
error: (msgOrError, data) => {
|
|
308
|
-
if (msgOrError instanceof Error) log("error", msgOrError.message, {
|
|
309
|
-
...data,
|
|
310
|
-
error_type: msgOrError.name,
|
|
311
|
-
error_stack: msgOrError.stack,
|
|
312
|
-
error_code: msgOrError.code
|
|
313
|
-
});
|
|
314
|
-
else log("error", msgOrError, data);
|
|
315
|
-
},
|
|
316
|
-
logger(childNamespace, childProps) {
|
|
317
|
-
return createWorkerLogger(postMessage, childNamespace ? `${namespace}:${childNamespace}` : namespace, {
|
|
318
|
-
...props,
|
|
319
|
-
...childProps
|
|
320
|
-
}, options);
|
|
321
|
-
},
|
|
322
|
-
span: createSpan,
|
|
323
|
-
child(context) {
|
|
324
|
-
if (typeof context === "string") return this.logger(context);
|
|
325
|
-
return createWorkerLogger(postMessage, namespace, {
|
|
326
|
-
...props,
|
|
327
|
-
...context
|
|
328
|
-
}, options);
|
|
329
|
-
},
|
|
330
|
-
end() {}
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
/** Safely stringify a value, handling circular refs and BigInt */
|
|
334
|
-
function safeStringify(value) {
|
|
335
|
-
try {
|
|
336
|
-
return JSON.stringify(value);
|
|
337
|
-
} catch {
|
|
338
|
-
return String(value);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
/** Format console args into a message string and optional data object */
|
|
342
|
-
function formatConsoleArgs(args) {
|
|
343
|
-
const message = args.length === 0 ? "" : args.length === 1 && typeof args[0] === "string" ? args[0] : args.map((a) => typeof a === "string" ? a : safeStringify(a)).join(" ");
|
|
344
|
-
const lastArg = args[args.length - 1];
|
|
345
|
-
return {
|
|
346
|
-
message,
|
|
347
|
-
data: args.length > 1 && typeof lastArg === "object" && lastArg !== null && !Array.isArray(lastArg) ? lastArg : void 0
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
/** Dispatch a message to a logger at the given console level */
|
|
351
|
-
function dispatchToLogger(logger, level, message, data) {
|
|
352
|
-
switch (level) {
|
|
353
|
-
case "trace":
|
|
354
|
-
logger.trace?.(message, data);
|
|
355
|
-
break;
|
|
356
|
-
case "debug":
|
|
357
|
-
logger.debug?.(message, data);
|
|
358
|
-
break;
|
|
359
|
-
case "info":
|
|
360
|
-
case "log":
|
|
361
|
-
logger.info?.(message, data);
|
|
362
|
-
break;
|
|
363
|
-
case "warn":
|
|
364
|
-
logger.warn?.(message, data);
|
|
365
|
-
break;
|
|
366
|
-
case "error":
|
|
367
|
-
logger.error?.(message, data);
|
|
368
|
-
break;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Create a handler for worker console messages.
|
|
373
|
-
*
|
|
374
|
-
* Use this on the main thread to receive and output messages from workers.
|
|
375
|
-
*
|
|
376
|
-
* @param options - Handler options
|
|
377
|
-
* @returns Handler function to call with worker messages
|
|
378
|
-
*
|
|
379
|
-
* @example
|
|
380
|
-
* ```typescript
|
|
381
|
-
* import { createWorkerConsoleHandler } from "loggily/worker"
|
|
382
|
-
*
|
|
383
|
-
* const handleConsole = createWorkerConsoleHandler({
|
|
384
|
-
* defaultNamespace: "km:worker:parse"
|
|
385
|
-
* })
|
|
386
|
-
*
|
|
387
|
-
* worker.onmessage = (e) => {
|
|
388
|
-
* if (e.data.type === "console") {
|
|
389
|
-
* handleConsole(e.data)
|
|
390
|
-
* } else {
|
|
391
|
-
* // Handle other message types
|
|
392
|
-
* }
|
|
393
|
-
* }
|
|
394
|
-
* ```
|
|
395
|
-
*/
|
|
396
|
-
function createWorkerConsoleHandler(options = {}) {
|
|
397
|
-
const loggers = /* @__PURE__ */ new Map();
|
|
398
|
-
function getLogger(namespace) {
|
|
399
|
-
const ns = namespace || options.defaultNamespace || "worker";
|
|
400
|
-
let logger = loggers.get(ns);
|
|
401
|
-
if (!logger) {
|
|
402
|
-
logger = options.logger ? options.logger : createLogger(ns);
|
|
403
|
-
loggers.set(ns, logger);
|
|
404
|
-
}
|
|
405
|
-
return logger;
|
|
406
|
-
}
|
|
407
|
-
return (message) => {
|
|
408
|
-
const logger = getLogger(message.namespace);
|
|
409
|
-
const { message: msg, data } = formatConsoleArgs(message.args);
|
|
410
|
-
dispatchToLogger(logger, message.level, msg, data);
|
|
411
|
-
};
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Create a handler for worker logger messages (logs and spans).
|
|
415
|
-
*
|
|
416
|
-
* Use this on the main thread to receive and output messages from workers
|
|
417
|
-
* that use createWorkerLogger.
|
|
418
|
-
*
|
|
419
|
-
* @param options - Handler options
|
|
420
|
-
* @returns Handler function to call with worker messages
|
|
421
|
-
*
|
|
422
|
-
* @example
|
|
423
|
-
* ```typescript
|
|
424
|
-
* import { createWorkerLogHandler, isWorkerMessage } from "loggily/worker"
|
|
425
|
-
*
|
|
426
|
-
* const handleLog = createWorkerLogHandler()
|
|
427
|
-
*
|
|
428
|
-
* worker.onmessage = (e) => {
|
|
429
|
-
* if (isWorkerMessage(e.data)) {
|
|
430
|
-
* handleLog(e.data)
|
|
431
|
-
* } else {
|
|
432
|
-
* // Handle other message types
|
|
433
|
-
* }
|
|
434
|
-
* }
|
|
435
|
-
* ```
|
|
436
|
-
*/
|
|
437
|
-
function createWorkerLogHandler(options = {}) {
|
|
438
|
-
const loggers = /* @__PURE__ */ new Map();
|
|
439
|
-
if (options.enableSpans) enableSpans();
|
|
440
|
-
function getLogger(namespace) {
|
|
441
|
-
let logger = loggers.get(namespace);
|
|
442
|
-
if (!logger) {
|
|
443
|
-
logger = createLogger(namespace);
|
|
444
|
-
loggers.set(namespace, logger);
|
|
445
|
-
}
|
|
446
|
-
return logger;
|
|
447
|
-
}
|
|
448
|
-
return (message) => {
|
|
449
|
-
if (isWorkerConsoleMessage(message)) {
|
|
450
|
-
const logger = getLogger(message.namespace || "worker");
|
|
451
|
-
const { message: msg, data } = formatConsoleArgs(message.args);
|
|
452
|
-
dispatchToLogger(logger, message.level, msg, data);
|
|
453
|
-
} else if (isWorkerLogMessage(message)) dispatchToLogger(getLogger(message.namespace), message.level, message.message, message.data);
|
|
454
|
-
else if (isWorkerSpanMessage(message)) {
|
|
455
|
-
if (message.event === "end") writeSpan(message.namespace, message.duration ?? 0, {
|
|
456
|
-
span_id: message.spanId,
|
|
457
|
-
trace_id: message.traceId,
|
|
458
|
-
parent_id: message.parentId,
|
|
459
|
-
...message.props,
|
|
460
|
-
...message.spanData
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
//#endregion
|
|
466
|
-
export { createWorkerConsoleHandler, createWorkerLogHandler, createWorkerLogger, forwardConsole, isWorkerConsoleMessage, isWorkerLogMessage, isWorkerMessage, isWorkerSpanMessage, resetWorkerIds, restoreConsole };
|
|
467
|
-
|
|
468
|
-
//# sourceMappingURL=worker.mjs.map
|