@contractspec/lib.logger 1.56.1 → 1.58.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.
- package/dist/context.browser.d.ts +44 -0
- package/dist/context.browser.d.ts.map +1 -0
- package/dist/context.browser.js +77 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1 -0
- package/dist/context.node.d.ts +43 -0
- package/dist/context.node.d.ts.map +1 -0
- package/dist/context.node.js +62 -0
- package/dist/elysia-plugin.d.ts +58 -0
- package/dist/elysia-plugin.d.ts.map +1 -0
- package/dist/elysia-plugin.js +793 -0
- package/dist/formatters.d.ts +25 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +232 -0
- package/dist/index.browser.d.ts +8 -0
- package/dist/index.browser.d.ts.map +1 -0
- package/dist/index.browser.js +728 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +800 -0
- package/dist/logger.browser.d.ts +48 -0
- package/dist/logger.browser.d.ts.map +1 -0
- package/dist/logger.browser.js +722 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +707 -0
- package/dist/logger.node.d.ts +48 -0
- package/dist/logger.node.d.ts.map +1 -0
- package/dist/logger.node.js +707 -0
- package/dist/node/context.js +0 -0
- package/dist/node/context.node.js +61 -0
- package/dist/node/elysia-plugin.js +792 -0
- package/dist/node/formatters.js +231 -0
- package/dist/node/index.js +799 -0
- package/dist/node/logger.js +706 -0
- package/dist/node/logger.node.js +706 -0
- package/dist/node/timer.js +122 -0
- package/dist/node/tracer.js +274 -0
- package/dist/node/tracer.node.js +274 -0
- package/dist/node/types.js +13 -0
- package/dist/timer.d.ts +99 -0
- package/dist/timer.d.ts.map +1 -0
- package/dist/timer.js +123 -0
- package/dist/tracer.browser.d.ts +47 -0
- package/dist/tracer.browser.d.ts.map +1 -0
- package/dist/tracer.browser.js +290 -0
- package/dist/tracer.d.ts +2 -0
- package/dist/tracer.d.ts.map +1 -0
- package/dist/tracer.js +275 -0
- package/dist/tracer.node.d.ts +47 -0
- package/dist/tracer.node.d.ts.map +1 -0
- package/dist/tracer.node.js +275 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/package.json +112 -42
- package/dist/context.browser.d.mts +0 -49
- package/dist/context.browser.d.mts.map +0 -1
- package/dist/context.browser.mjs +0 -89
- package/dist/context.browser.mjs.map +0 -1
- package/dist/context.d.mts +0 -17
- package/dist/context.d.mts.map +0 -1
- package/dist/context.mjs +0 -1
- package/dist/context.node.d.mts +0 -48
- package/dist/context.node.d.mts.map +0 -1
- package/dist/context.node.mjs +0 -79
- package/dist/context.node.mjs.map +0 -1
- package/dist/elysia-plugin.d.mts +0 -63
- package/dist/elysia-plugin.d.mts.map +0 -1
- package/dist/elysia-plugin.mjs +0 -84
- package/dist/elysia-plugin.mjs.map +0 -1
- package/dist/formatters.d.mts +0 -29
- package/dist/formatters.d.mts.map +0 -1
- package/dist/formatters.mjs +0 -180
- package/dist/formatters.mjs.map +0 -1
- package/dist/index.browser.d.mts +0 -7
- package/dist/index.browser.mjs +0 -8
- package/dist/index.d.mts +0 -8
- package/dist/index.mjs +0 -9
- package/dist/logger.browser.d.mts +0 -51
- package/dist/logger.browser.d.mts.map +0 -1
- package/dist/logger.browser.mjs +0 -190
- package/dist/logger.browser.mjs.map +0 -1
- package/dist/logger.d.mts +0 -2
- package/dist/logger.mjs +0 -3
- package/dist/logger.node.d.mts +0 -51
- package/dist/logger.node.d.mts.map +0 -1
- package/dist/logger.node.mjs +0 -190
- package/dist/logger.node.mjs.map +0 -1
- package/dist/timer.d.mts +0 -103
- package/dist/timer.d.mts.map +0 -1
- package/dist/timer.mjs +0 -165
- package/dist/timer.mjs.map +0 -1
- package/dist/tracer.browser.d.mts +0 -51
- package/dist/tracer.browser.d.mts.map +0 -1
- package/dist/tracer.browser.mjs +0 -116
- package/dist/tracer.browser.mjs.map +0 -1
- package/dist/tracer.d.mts +0 -2
- package/dist/tracer.mjs +0 -3
- package/dist/tracer.node.d.mts +0 -51
- package/dist/tracer.node.d.mts.map +0 -1
- package/dist/tracer.node.mjs +0 -116
- package/dist/tracer.node.mjs.map +0 -1
- package/dist/types.d.mts +0 -71
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs +0 -14
- package/dist/types.mjs.map +0 -1
package/dist/timer.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { Timer as ITimer } from './types';
|
|
2
|
+
export declare class Timer implements ITimer {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
private startTime;
|
|
5
|
+
private laps;
|
|
6
|
+
private stopped;
|
|
7
|
+
private stopTime?;
|
|
8
|
+
constructor(id?: string);
|
|
9
|
+
/**
|
|
10
|
+
* Stop the timer and return elapsed time in milliseconds
|
|
11
|
+
*/
|
|
12
|
+
stop(): number;
|
|
13
|
+
/**
|
|
14
|
+
* Record a lap time and return elapsed time since start
|
|
15
|
+
*/
|
|
16
|
+
lap(label?: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* Get elapsed time without stopping the timer
|
|
19
|
+
*/
|
|
20
|
+
getElapsed(): number;
|
|
21
|
+
/**
|
|
22
|
+
* Get all recorded laps
|
|
23
|
+
*/
|
|
24
|
+
getLaps(): {
|
|
25
|
+
label?: string;
|
|
26
|
+
time: number;
|
|
27
|
+
elapsed: number;
|
|
28
|
+
}[];
|
|
29
|
+
/**
|
|
30
|
+
* Get timer summary with total time and laps
|
|
31
|
+
*/
|
|
32
|
+
getSummary(): {
|
|
33
|
+
id: string;
|
|
34
|
+
totalTime: number;
|
|
35
|
+
isRunning: boolean;
|
|
36
|
+
laps: {
|
|
37
|
+
label?: string;
|
|
38
|
+
time: number;
|
|
39
|
+
elapsed: number;
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Reset the timer (starts a new timing session)
|
|
44
|
+
*/
|
|
45
|
+
reset(): void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Utility class for managing multiple timers
|
|
49
|
+
*/
|
|
50
|
+
export declare class TimerManager {
|
|
51
|
+
private timers;
|
|
52
|
+
/**
|
|
53
|
+
* Start a new timer
|
|
54
|
+
*/
|
|
55
|
+
start(id?: string): Timer;
|
|
56
|
+
/**
|
|
57
|
+
* Get an existing timer
|
|
58
|
+
*/
|
|
59
|
+
get(id: string): Timer | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Stop and remove a timer
|
|
62
|
+
*/
|
|
63
|
+
stop(id: string): number | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Get all active timers
|
|
66
|
+
*/
|
|
67
|
+
getActive(): Timer[];
|
|
68
|
+
/**
|
|
69
|
+
* Clear all timers
|
|
70
|
+
*/
|
|
71
|
+
clear(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Get summary of all timers
|
|
74
|
+
*/
|
|
75
|
+
getSummary(): ReturnType<Timer['getSummary']>[];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Decorator/wrapper function to time async operations
|
|
79
|
+
*/
|
|
80
|
+
export declare function timed<T>(operation: () => Promise<T>, options?: {
|
|
81
|
+
id?: string;
|
|
82
|
+
onComplete?: (elapsed: number) => void;
|
|
83
|
+
}): Promise<{
|
|
84
|
+
result: T;
|
|
85
|
+
elapsed: number;
|
|
86
|
+
timer: Timer;
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Decorator/wrapper function to time synchronous operations
|
|
90
|
+
*/
|
|
91
|
+
export declare function timedSync<T>(operation: () => T, options?: {
|
|
92
|
+
id?: string;
|
|
93
|
+
onComplete?: (elapsed: number) => void;
|
|
94
|
+
}): {
|
|
95
|
+
result: T;
|
|
96
|
+
elapsed: number;
|
|
97
|
+
timer: Timer;
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=timer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,SAAS,CAAC;AAE/C,qBAAa,KAAM,YAAW,MAAM;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAA2D;IACvE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,EAAE,CAAC,EAAE,MAAM;IAKvB;;OAEG;IACH,IAAI,IAAI,MAAM;IAkBd;;OAEG;IACH,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAiB3B;;OAEG;IACH,UAAU,IAAI,MAAM;IAOpB;;OAEG;IACH,OAAO,IAAI;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAI9D;;OAEG;IACH,UAAU,IAAI;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC3D;IASD;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA4B;IAE1C;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK;IAMzB;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIlC;;OAEG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUpC;;OAEG;IACH,SAAS,IAAI,KAAK,EAAE;IAMpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE;CAGhD;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAChE,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAcvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,SAAS,EAAE,MAAM,CAAC,EAClB,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAChE;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAc9C"}
|
package/dist/timer.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/timer.ts
|
|
3
|
+
class Timer {
|
|
4
|
+
id;
|
|
5
|
+
startTime;
|
|
6
|
+
laps = [];
|
|
7
|
+
stopped = false;
|
|
8
|
+
stopTime;
|
|
9
|
+
constructor(id) {
|
|
10
|
+
this.id = id || crypto.randomUUID();
|
|
11
|
+
this.startTime = performance.now();
|
|
12
|
+
}
|
|
13
|
+
stop() {
|
|
14
|
+
if (this.stopped) {
|
|
15
|
+
return this.getElapsed();
|
|
16
|
+
}
|
|
17
|
+
this.stopTime = performance.now();
|
|
18
|
+
this.stopped = true;
|
|
19
|
+
const elapsed = this.stopTime - this.startTime;
|
|
20
|
+
this.laps.push({
|
|
21
|
+
label: "stop",
|
|
22
|
+
time: this.stopTime,
|
|
23
|
+
elapsed
|
|
24
|
+
});
|
|
25
|
+
return elapsed;
|
|
26
|
+
}
|
|
27
|
+
lap(label) {
|
|
28
|
+
if (this.stopped) {
|
|
29
|
+
return this.getElapsed();
|
|
30
|
+
}
|
|
31
|
+
const now = performance.now();
|
|
32
|
+
const elapsed = now - this.startTime;
|
|
33
|
+
this.laps.push({
|
|
34
|
+
label: label || `lap-${this.laps.length + 1}`,
|
|
35
|
+
time: now,
|
|
36
|
+
elapsed
|
|
37
|
+
});
|
|
38
|
+
return elapsed;
|
|
39
|
+
}
|
|
40
|
+
getElapsed() {
|
|
41
|
+
if (this.stopped && this.stopTime) {
|
|
42
|
+
return this.stopTime - this.startTime;
|
|
43
|
+
}
|
|
44
|
+
return performance.now() - this.startTime;
|
|
45
|
+
}
|
|
46
|
+
getLaps() {
|
|
47
|
+
return [...this.laps];
|
|
48
|
+
}
|
|
49
|
+
getSummary() {
|
|
50
|
+
return {
|
|
51
|
+
id: this.id,
|
|
52
|
+
totalTime: this.getElapsed(),
|
|
53
|
+
isRunning: !this.stopped,
|
|
54
|
+
laps: this.getLaps()
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
reset() {
|
|
58
|
+
this.startTime = performance.now();
|
|
59
|
+
this.laps = [];
|
|
60
|
+
this.stopped = false;
|
|
61
|
+
this.stopTime = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
class TimerManager {
|
|
66
|
+
timers = new Map;
|
|
67
|
+
start(id) {
|
|
68
|
+
const timer = new Timer(id);
|
|
69
|
+
this.timers.set(timer.id, timer);
|
|
70
|
+
return timer;
|
|
71
|
+
}
|
|
72
|
+
get(id) {
|
|
73
|
+
return this.timers.get(id);
|
|
74
|
+
}
|
|
75
|
+
stop(id) {
|
|
76
|
+
const timer = this.timers.get(id);
|
|
77
|
+
if (timer) {
|
|
78
|
+
const elapsed = timer.stop();
|
|
79
|
+
this.timers.delete(id);
|
|
80
|
+
return elapsed;
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
getActive() {
|
|
85
|
+
return Array.from(this.timers.values()).filter((timer) => !timer.getSummary().isRunning === false);
|
|
86
|
+
}
|
|
87
|
+
clear() {
|
|
88
|
+
this.timers.clear();
|
|
89
|
+
}
|
|
90
|
+
getSummary() {
|
|
91
|
+
return Array.from(this.timers.values()).map((timer) => timer.getSummary());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function timed(operation, options) {
|
|
95
|
+
const timer = new Timer(options?.id);
|
|
96
|
+
try {
|
|
97
|
+
const result = await operation();
|
|
98
|
+
const elapsed = timer.stop();
|
|
99
|
+
options?.onComplete?.(elapsed);
|
|
100
|
+
return { result, elapsed, timer };
|
|
101
|
+
} catch (error) {
|
|
102
|
+
timer.stop();
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function timedSync(operation, options) {
|
|
107
|
+
const timer = new Timer(options?.id);
|
|
108
|
+
try {
|
|
109
|
+
const result = operation();
|
|
110
|
+
const elapsed = timer.stop();
|
|
111
|
+
options?.onComplete?.(elapsed);
|
|
112
|
+
return { result, elapsed, timer };
|
|
113
|
+
} catch (error) {
|
|
114
|
+
timer.stop();
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export {
|
|
119
|
+
timedSync,
|
|
120
|
+
timed,
|
|
121
|
+
TimerManager,
|
|
122
|
+
Timer
|
|
123
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { TraceContext, TracingOptions } from './types';
|
|
2
|
+
export declare class Tracer {
|
|
3
|
+
private context;
|
|
4
|
+
private activeSpans;
|
|
5
|
+
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* Start a new trace span
|
|
8
|
+
*/
|
|
9
|
+
startSpan(options: TracingOptions): TraceContext;
|
|
10
|
+
/**
|
|
11
|
+
* Finish a trace span
|
|
12
|
+
*/
|
|
13
|
+
finishSpan(spanId: string): number | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Execute a function within a trace span
|
|
16
|
+
*/
|
|
17
|
+
trace<T>(options: TracingOptions, fn: () => T | Promise<T>): Promise<T>;
|
|
18
|
+
/**
|
|
19
|
+
* Add metadata to current span
|
|
20
|
+
*/
|
|
21
|
+
addMetadata(key: string, value: unknown): void;
|
|
22
|
+
/**
|
|
23
|
+
* Add tags to current span
|
|
24
|
+
*/
|
|
25
|
+
addTags(...tags: string[]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Get current trace context
|
|
28
|
+
*/
|
|
29
|
+
getCurrentTrace(): TraceContext | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Get all active spans
|
|
32
|
+
*/
|
|
33
|
+
getActiveSpans(): TraceContext[];
|
|
34
|
+
/**
|
|
35
|
+
* Find a span by ID
|
|
36
|
+
*/
|
|
37
|
+
findSpanById(spanId: string): TraceContext | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Generate a unique trace ID
|
|
40
|
+
*/
|
|
41
|
+
private generateTraceId;
|
|
42
|
+
/**
|
|
43
|
+
* Generate a unique span ID
|
|
44
|
+
*/
|
|
45
|
+
private generateSpanId;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=tracer.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.browser.d.ts","sourceRoot":"","sources":["../src/tracer.browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI5D,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,WAAW,CAAmC;;IAMtD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;IAqBhD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAqB9C;;OAEG;IACG,KAAK,CAAC,CAAC,EACX,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC;IAuCb;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAO9C;;OAEG;IACH,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAOhC;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,SAAS;IAI3C;;OAEG;IACH,cAAc,IAAI,YAAY,EAAE;IAIhC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAItD;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAGvB"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/context.browser.ts
|
|
3
|
+
import"zone.js";
|
|
4
|
+
var ZONE = globalThis.Zone;
|
|
5
|
+
var STORE_KEY = "__lssm_log_context_data__";
|
|
6
|
+
function getStore() {
|
|
7
|
+
if (!ZONE)
|
|
8
|
+
return;
|
|
9
|
+
return ZONE.current.get(STORE_KEY);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
class LogContext {
|
|
13
|
+
static instance;
|
|
14
|
+
static fallbackCounter = 0;
|
|
15
|
+
static getInstance() {
|
|
16
|
+
if (!LogContext.instance) {
|
|
17
|
+
LogContext.instance = new LogContext;
|
|
18
|
+
}
|
|
19
|
+
return LogContext.instance;
|
|
20
|
+
}
|
|
21
|
+
run(context, fn) {
|
|
22
|
+
const contextData = {
|
|
23
|
+
context: { ...context },
|
|
24
|
+
trace: this.getCurrentTrace()
|
|
25
|
+
};
|
|
26
|
+
if (!ZONE) {
|
|
27
|
+
return fn();
|
|
28
|
+
}
|
|
29
|
+
const zone = ZONE.current.fork({
|
|
30
|
+
name: "log-context",
|
|
31
|
+
properties: { [STORE_KEY]: contextData }
|
|
32
|
+
});
|
|
33
|
+
return zone.run(fn);
|
|
34
|
+
}
|
|
35
|
+
extend(additionalContext, fn) {
|
|
36
|
+
const currentContext = this.getContext();
|
|
37
|
+
const mergedContext = {
|
|
38
|
+
...currentContext,
|
|
39
|
+
...additionalContext
|
|
40
|
+
};
|
|
41
|
+
return this.run(mergedContext, fn);
|
|
42
|
+
}
|
|
43
|
+
set(key, value) {
|
|
44
|
+
const current = getStore();
|
|
45
|
+
if (current) {
|
|
46
|
+
current.context[key] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
get(key) {
|
|
50
|
+
const current = getStore();
|
|
51
|
+
return current?.context?.[key];
|
|
52
|
+
}
|
|
53
|
+
getContext() {
|
|
54
|
+
const current = getStore();
|
|
55
|
+
return current?.context || {};
|
|
56
|
+
}
|
|
57
|
+
setTrace(trace) {
|
|
58
|
+
const current = getStore();
|
|
59
|
+
if (current) {
|
|
60
|
+
current.trace = trace;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getCurrentTrace() {
|
|
64
|
+
const current = getStore();
|
|
65
|
+
return current?.trace;
|
|
66
|
+
}
|
|
67
|
+
generateId() {
|
|
68
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
69
|
+
return crypto.randomUUID();
|
|
70
|
+
}
|
|
71
|
+
LogContext.fallbackCounter += 1;
|
|
72
|
+
return `log-${LogContext.fallbackCounter}`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/timer.ts
|
|
77
|
+
class Timer {
|
|
78
|
+
id;
|
|
79
|
+
startTime;
|
|
80
|
+
laps = [];
|
|
81
|
+
stopped = false;
|
|
82
|
+
stopTime;
|
|
83
|
+
constructor(id) {
|
|
84
|
+
this.id = id || crypto.randomUUID();
|
|
85
|
+
this.startTime = performance.now();
|
|
86
|
+
}
|
|
87
|
+
stop() {
|
|
88
|
+
if (this.stopped) {
|
|
89
|
+
return this.getElapsed();
|
|
90
|
+
}
|
|
91
|
+
this.stopTime = performance.now();
|
|
92
|
+
this.stopped = true;
|
|
93
|
+
const elapsed = this.stopTime - this.startTime;
|
|
94
|
+
this.laps.push({
|
|
95
|
+
label: "stop",
|
|
96
|
+
time: this.stopTime,
|
|
97
|
+
elapsed
|
|
98
|
+
});
|
|
99
|
+
return elapsed;
|
|
100
|
+
}
|
|
101
|
+
lap(label) {
|
|
102
|
+
if (this.stopped) {
|
|
103
|
+
return this.getElapsed();
|
|
104
|
+
}
|
|
105
|
+
const now = performance.now();
|
|
106
|
+
const elapsed = now - this.startTime;
|
|
107
|
+
this.laps.push({
|
|
108
|
+
label: label || `lap-${this.laps.length + 1}`,
|
|
109
|
+
time: now,
|
|
110
|
+
elapsed
|
|
111
|
+
});
|
|
112
|
+
return elapsed;
|
|
113
|
+
}
|
|
114
|
+
getElapsed() {
|
|
115
|
+
if (this.stopped && this.stopTime) {
|
|
116
|
+
return this.stopTime - this.startTime;
|
|
117
|
+
}
|
|
118
|
+
return performance.now() - this.startTime;
|
|
119
|
+
}
|
|
120
|
+
getLaps() {
|
|
121
|
+
return [...this.laps];
|
|
122
|
+
}
|
|
123
|
+
getSummary() {
|
|
124
|
+
return {
|
|
125
|
+
id: this.id,
|
|
126
|
+
totalTime: this.getElapsed(),
|
|
127
|
+
isRunning: !this.stopped,
|
|
128
|
+
laps: this.getLaps()
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
reset() {
|
|
132
|
+
this.startTime = performance.now();
|
|
133
|
+
this.laps = [];
|
|
134
|
+
this.stopped = false;
|
|
135
|
+
this.stopTime = undefined;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
class TimerManager {
|
|
140
|
+
timers = new Map;
|
|
141
|
+
start(id) {
|
|
142
|
+
const timer = new Timer(id);
|
|
143
|
+
this.timers.set(timer.id, timer);
|
|
144
|
+
return timer;
|
|
145
|
+
}
|
|
146
|
+
get(id) {
|
|
147
|
+
return this.timers.get(id);
|
|
148
|
+
}
|
|
149
|
+
stop(id) {
|
|
150
|
+
const timer = this.timers.get(id);
|
|
151
|
+
if (timer) {
|
|
152
|
+
const elapsed = timer.stop();
|
|
153
|
+
this.timers.delete(id);
|
|
154
|
+
return elapsed;
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
getActive() {
|
|
159
|
+
return Array.from(this.timers.values()).filter((timer) => !timer.getSummary().isRunning === false);
|
|
160
|
+
}
|
|
161
|
+
clear() {
|
|
162
|
+
this.timers.clear();
|
|
163
|
+
}
|
|
164
|
+
getSummary() {
|
|
165
|
+
return Array.from(this.timers.values()).map((timer) => timer.getSummary());
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function timed(operation, options) {
|
|
169
|
+
const timer = new Timer(options?.id);
|
|
170
|
+
try {
|
|
171
|
+
const result = await operation();
|
|
172
|
+
const elapsed = timer.stop();
|
|
173
|
+
options?.onComplete?.(elapsed);
|
|
174
|
+
return { result, elapsed, timer };
|
|
175
|
+
} catch (error) {
|
|
176
|
+
timer.stop();
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function timedSync(operation, options) {
|
|
181
|
+
const timer = new Timer(options?.id);
|
|
182
|
+
try {
|
|
183
|
+
const result = operation();
|
|
184
|
+
const elapsed = timer.stop();
|
|
185
|
+
options?.onComplete?.(elapsed);
|
|
186
|
+
return { result, elapsed, timer };
|
|
187
|
+
} catch (error) {
|
|
188
|
+
timer.stop();
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/tracer.browser.ts
|
|
194
|
+
class Tracer {
|
|
195
|
+
context;
|
|
196
|
+
activeSpans = new Map;
|
|
197
|
+
constructor() {
|
|
198
|
+
this.context = LogContext.getInstance();
|
|
199
|
+
}
|
|
200
|
+
startSpan(options) {
|
|
201
|
+
const parentTrace = this.context.getCurrentTrace();
|
|
202
|
+
const traceId = parentTrace?.traceId || this.generateTraceId();
|
|
203
|
+
const span = {
|
|
204
|
+
traceId,
|
|
205
|
+
parentId: parentTrace?.spanId,
|
|
206
|
+
spanId: this.generateSpanId(),
|
|
207
|
+
operationType: options.operationType,
|
|
208
|
+
operationName: options.operationName,
|
|
209
|
+
startTime: performance.now(),
|
|
210
|
+
metadata: { ...options.metadata },
|
|
211
|
+
tags: [...options.tags || []]
|
|
212
|
+
};
|
|
213
|
+
this.activeSpans.set(span.spanId, span);
|
|
214
|
+
this.context.setTrace(span);
|
|
215
|
+
return span;
|
|
216
|
+
}
|
|
217
|
+
finishSpan(spanId) {
|
|
218
|
+
const span = this.activeSpans.get(spanId);
|
|
219
|
+
if (!span) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const duration = performance.now() - span.startTime;
|
|
223
|
+
this.activeSpans.delete(spanId);
|
|
224
|
+
const currentTrace = this.context.getCurrentTrace();
|
|
225
|
+
if (currentTrace?.spanId === spanId && span.parentId) {
|
|
226
|
+
const parentSpan = this.findSpanById(span.parentId);
|
|
227
|
+
if (parentSpan) {
|
|
228
|
+
this.context.setTrace(parentSpan);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return duration;
|
|
232
|
+
}
|
|
233
|
+
async trace(options, fn) {
|
|
234
|
+
const span = this.startSpan(options);
|
|
235
|
+
const timer = options.autoTiming !== false ? new Timer(`trace-${span.spanId}`) : undefined;
|
|
236
|
+
try {
|
|
237
|
+
const result = await fn();
|
|
238
|
+
const duration = this.finishSpan(span.spanId);
|
|
239
|
+
if (timer) {
|
|
240
|
+
timer.stop();
|
|
241
|
+
}
|
|
242
|
+
if (duration !== undefined) {
|
|
243
|
+
span.metadata.duration = duration;
|
|
244
|
+
}
|
|
245
|
+
return result;
|
|
246
|
+
} catch (error) {
|
|
247
|
+
span.metadata.error = {
|
|
248
|
+
name: error.name || "Unknown",
|
|
249
|
+
message: error.message || "Unknown error",
|
|
250
|
+
stack: error.stack
|
|
251
|
+
};
|
|
252
|
+
const duration = this.finishSpan(span.spanId);
|
|
253
|
+
span.metadata.duration = duration;
|
|
254
|
+
if (timer) {
|
|
255
|
+
timer.stop();
|
|
256
|
+
}
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
addMetadata(key, value) {
|
|
261
|
+
const currentTrace = this.context.getCurrentTrace();
|
|
262
|
+
if (currentTrace) {
|
|
263
|
+
currentTrace.metadata[key] = value;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
addTags(...tags) {
|
|
267
|
+
const currentTrace = this.context.getCurrentTrace();
|
|
268
|
+
if (currentTrace) {
|
|
269
|
+
currentTrace.tags.push(...tags);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
getCurrentTrace() {
|
|
273
|
+
return this.context.getCurrentTrace();
|
|
274
|
+
}
|
|
275
|
+
getActiveSpans() {
|
|
276
|
+
return Array.from(this.activeSpans.values());
|
|
277
|
+
}
|
|
278
|
+
findSpanById(spanId) {
|
|
279
|
+
return this.activeSpans.get(spanId);
|
|
280
|
+
}
|
|
281
|
+
generateTraceId() {
|
|
282
|
+
return crypto.randomUUID().replace(/-/g, "");
|
|
283
|
+
}
|
|
284
|
+
generateSpanId() {
|
|
285
|
+
return crypto.randomUUID().replace(/-/g, "").substring(0, 16);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
export {
|
|
289
|
+
Tracer
|
|
290
|
+
};
|
package/dist/tracer.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../src/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
|