@spinajs/log-common 2.0.481 → 2.0.482

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.
Files changed (68) hide show
  1. package/README.md +125 -4
  2. package/lib/cjs/BatchQueue.d.ts +127 -0
  3. package/lib/cjs/BatchQueue.d.ts.map +1 -0
  4. package/lib/cjs/BatchQueue.js +126 -0
  5. package/lib/cjs/BatchQueue.js.map +1 -0
  6. package/lib/cjs/filters/filter.d.ts +27 -0
  7. package/lib/cjs/filters/filter.d.ts.map +1 -0
  8. package/lib/cjs/filters/filter.js +20 -0
  9. package/lib/cjs/filters/filter.js.map +1 -0
  10. package/lib/cjs/filters/whenRepeated.d.ts +52 -0
  11. package/lib/cjs/filters/whenRepeated.d.ts.map +1 -0
  12. package/lib/cjs/filters/whenRepeated.js +98 -0
  13. package/lib/cjs/filters/whenRepeated.js.map +1 -0
  14. package/lib/cjs/format.d.ts +20 -0
  15. package/lib/cjs/format.d.ts.map +1 -0
  16. package/lib/cjs/format.js +75 -0
  17. package/lib/cjs/format.js.map +1 -0
  18. package/lib/cjs/index.d.ts +260 -21
  19. package/lib/cjs/index.d.ts.map +1 -1
  20. package/lib/cjs/index.js +207 -33
  21. package/lib/cjs/index.js.map +1 -1
  22. package/lib/cjs/perf.d.ts +109 -0
  23. package/lib/cjs/perf.d.ts.map +1 -0
  24. package/lib/cjs/perf.js +162 -0
  25. package/lib/cjs/perf.js.map +1 -0
  26. package/lib/cjs/persistence.d.ts +19 -0
  27. package/lib/cjs/persistence.d.ts.map +1 -0
  28. package/lib/cjs/persistence.js +137 -0
  29. package/lib/cjs/persistence.js.map +1 -0
  30. package/lib/cjs/serializers.d.ts +77 -0
  31. package/lib/cjs/serializers.d.ts.map +1 -0
  32. package/lib/cjs/serializers.js +215 -0
  33. package/lib/cjs/serializers.js.map +1 -0
  34. package/lib/mjs/BatchQueue.d.ts +127 -0
  35. package/lib/mjs/BatchQueue.d.ts.map +1 -0
  36. package/lib/mjs/BatchQueue.js +122 -0
  37. package/lib/mjs/BatchQueue.js.map +1 -0
  38. package/lib/mjs/filters/filter.d.ts +27 -0
  39. package/lib/mjs/filters/filter.d.ts.map +1 -0
  40. package/lib/mjs/filters/filter.js +16 -0
  41. package/lib/mjs/filters/filter.js.map +1 -0
  42. package/lib/mjs/filters/whenRepeated.d.ts +52 -0
  43. package/lib/mjs/filters/whenRepeated.d.ts.map +1 -0
  44. package/lib/mjs/filters/whenRepeated.js +95 -0
  45. package/lib/mjs/filters/whenRepeated.js.map +1 -0
  46. package/lib/mjs/format.d.ts +20 -0
  47. package/lib/mjs/format.d.ts.map +1 -0
  48. package/lib/mjs/format.js +72 -0
  49. package/lib/mjs/format.js.map +1 -0
  50. package/lib/mjs/index.d.ts +260 -21
  51. package/lib/mjs/index.d.ts.map +1 -1
  52. package/lib/mjs/index.js +201 -10
  53. package/lib/mjs/index.js.map +1 -1
  54. package/lib/mjs/perf.d.ts +109 -0
  55. package/lib/mjs/perf.d.ts.map +1 -0
  56. package/lib/mjs/perf.js +157 -0
  57. package/lib/mjs/perf.js.map +1 -0
  58. package/lib/mjs/persistence.d.ts +19 -0
  59. package/lib/mjs/persistence.d.ts.map +1 -0
  60. package/lib/mjs/persistence.js +132 -0
  61. package/lib/mjs/persistence.js.map +1 -0
  62. package/lib/mjs/serializers.d.ts +77 -0
  63. package/lib/mjs/serializers.d.ts.map +1 -0
  64. package/lib/mjs/serializers.js +208 -0
  65. package/lib/mjs/serializers.js.map +1 -0
  66. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  67. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  68. package/package.json +8 -9
package/lib/cjs/index.js CHANGED
@@ -10,34 +10,15 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
13
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
14
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
15
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
16
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
17
  return c > 3 && r && Object.defineProperty(target, key, r), r;
23
18
  };
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
41
22
  var __metadata = (this && this.__metadata) || function (k, v) {
42
23
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
24
  };
@@ -45,12 +26,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
45
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
46
27
  };
47
28
  Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.Log = exports.LogTarget = exports.LogLevelStrings = exports.StrToLogLevel = exports.LogLevel = void 0;
29
+ exports.Log = exports.LogTarget = exports.LogLevelToSeverityNumber = exports.LogLevelStrings = exports.SILENT_LEVEL = exports.StrToLogLevel = exports.LogLevel = void 0;
30
+ exports.normalizeLevel = normalizeLevel;
49
31
  exports.createLogMessageObject = createLogMessageObject;
50
32
  exports.Logger = Logger;
33
+ exports.setLogContextProvider = setLogContextProvider;
51
34
  const di_1 = require("@spinajs/di");
52
35
  const lodash_1 = __importDefault(require("lodash"));
53
- const util = __importStar(require("util"));
36
+ const format_js_1 = require("./format.js");
37
+ const serializers_js_1 = require("./serializers.js");
38
+ const persistence_js_1 = require("./persistence.js");
39
+ __exportStar(require("./serializers.js"), exports);
40
+ __exportStar(require("./filters/filter.js"), exports);
41
+ __exportStar(require("./filters/whenRepeated.js"), exports);
42
+ __exportStar(require("./BatchQueue.js"), exports);
43
+ __exportStar(require("./persistence.js"), exports);
44
+ __exportStar(require("./perf.js"), exports);
54
45
  var LogLevel;
55
46
  (function (LogLevel) {
56
47
  LogLevel[LogLevel["Security"] = 999] = "Security";
@@ -72,6 +63,29 @@ exports.StrToLogLevel = {
72
63
  fatal: LogLevel.Fatal,
73
64
  security: LogLevel.Security,
74
65
  };
66
+ /**
67
+ * Sentinel level sitting one ABOVE {@link LogLevel.Security} ( SpinaJS's highest
68
+ * real level ). Used by `Log.disableAll()` as the runtime override so even a
69
+ * `security()` call is gated out - `isEnabled` compares numerically, so nothing
70
+ * ever reaches it.
71
+ */
72
+ exports.SILENT_LEVEL = LogLevel.Security + 1;
73
+ /**
74
+ * Normalises a level given either as a {@link LogLevel} number or a level name
75
+ * ( "trace" | "debug" | ... ) to its numeric value. Single validation choke
76
+ * point: an unknown name throws a clear error. Numbers pass straight through
77
+ * ( so {@link SILENT_LEVEL } and other synthetic values are accepted ).
78
+ */
79
+ function normalizeLevel(level) {
80
+ if (typeof level === "number") {
81
+ return level;
82
+ }
83
+ const resolved = exports.StrToLogLevel[level];
84
+ if (resolved === undefined) {
85
+ throw new Error(`Invalid log level: ${level}`);
86
+ }
87
+ return resolved;
88
+ }
75
89
  exports.LogLevelStrings = {
76
90
  [LogLevel.Debug]: "debug",
77
91
  [LogLevel.Error]: "error",
@@ -82,11 +96,37 @@ exports.LogLevelStrings = {
82
96
  [LogLevel.Trace]: "trace",
83
97
  [LogLevel.Warn]: "warn",
84
98
  };
99
+ /**
100
+ * Maps SpinaJS log levels onto the OpenTelemetry SeverityNumber scale ( 1..24 ),
101
+ * so structured logs can be severity-ranked/filtered by any OTel-aware backend
102
+ * ( Grafana, Datadog, Elastic, OTLP pipelines ). Anchored on the OTel bands:
103
+ * TRACE 1-4, DEBUG 5-8, INFO 9-12, WARN 13-16, ERROR 17-20, FATAL 21-24.
104
+ * Success sits in the INFO band ( above plain info ); Security is mapped to the
105
+ * top of the FATAL band as SpinaJS's highest severity.
106
+ */
107
+ exports.LogLevelToSeverityNumber = {
108
+ [LogLevel.Trace]: 1,
109
+ [LogLevel.Debug]: 5,
110
+ [LogLevel.Info]: 9,
111
+ [LogLevel.Success]: 11,
112
+ [LogLevel.Warn]: 13,
113
+ [LogLevel.Error]: 17,
114
+ [LogLevel.Fatal]: 21,
115
+ [LogLevel.Security]: 23,
116
+ };
85
117
  class LogTarget extends di_1.SyncService {
86
118
  constructor(options) {
87
119
  super();
88
120
  this.HasError = false;
89
121
  this.Error = null;
122
+ /**
123
+ * Drop-hook. Set by a wrapper ( eg. {@link FallbackGroupTarget} ) to receive
124
+ * entries this target GAVE UP on ( buffer overflow or a non-retryable delivery
125
+ * failure ), so a durable fallback can catch EXACTLY what was not delivered —
126
+ * no duplicates. `null` ( the default ) means nobody is listening and dropped
127
+ * entries are simply discarded, as before.
128
+ */
129
+ this.OnDropped = null;
90
130
  if (options) {
91
131
  this.Options = lodash_1.default.merge(lodash_1.default.merge(this.Options, {
92
132
  enabled: true,
@@ -100,21 +140,38 @@ class LogTarget extends di_1.SyncService {
100
140
  };
101
141
  }
102
142
  }
143
+ /** Flush any buffered entries to the underlying sink. Default no-op; buffered targets override. */
144
+ forceFlush() {
145
+ return Promise.resolve();
146
+ }
103
147
  }
104
148
  exports.LogTarget = LogTarget;
105
149
  function createLogMessageObject(err, message, level, logger, variables, ...args) {
106
150
  const sMsg = err instanceof Error || !err ? message : err;
107
- const tMsg = args.length !== 0 ? util.format(sMsg, ...args) : sMsg;
151
+ const tMsg = args.length !== 0 ? (0, format_js_1.format)(sMsg, ...args) : sMsg;
108
152
  const lName = logger ?? message;
153
+ // Ambient async-context fields ( lowest precedence, must never throw ). The
154
+ // computed core fields below and any explicit per-call / logger `variables`
155
+ // OVERRIDE these — ambient context only FILLS IN fields nobody else set.
156
+ let ctx = {};
157
+ try {
158
+ ctx = logContextProvider() ?? {};
159
+ }
160
+ catch {
161
+ ctx = {};
162
+ }
163
+ const theVars = {
164
+ ...ctx,
165
+ error: err instanceof Error ? err : undefined,
166
+ level: exports.LogLevelStrings[`${level}`].toUpperCase(),
167
+ logger: lName,
168
+ message: tMsg,
169
+ ...variables,
170
+ };
171
+ (0, serializers_js_1.applySerializers)(theVars);
109
172
  return {
110
173
  Level: level,
111
- Variables: {
112
- error: err instanceof Error ? err : undefined,
113
- level: exports.LogLevelStrings[`${level}`].toUpperCase(),
114
- logger: lName,
115
- message: tMsg,
116
- ...variables,
117
- },
174
+ Variables: theVars,
118
175
  };
119
176
  }
120
177
  class Log extends di_1.SyncService {
@@ -122,9 +179,87 @@ class Log extends di_1.SyncService {
122
179
  super(...arguments);
123
180
  this.Timers = new Map();
124
181
  this.Variables = {};
182
+ /**
183
+ * Lowest level any of this logger's targets accepts ( the MIN across its
184
+ * matched rules ). Set by FrameworkLogger.resolve(); default Trace = allow
185
+ * all. A call below this level would be dropped by every target anyway, so the
186
+ * per-method guard can safely short-circuit on it.
187
+ */
188
+ this.MinLevel = LogLevel.Trace;
189
+ /**
190
+ * Runtime level override ( loglevel-style ). `null` means "no override, use
191
+ * MinLevel". Set via setLevel/enableAll/disableAll, cleared via resetLevel.
192
+ */
193
+ this.LevelOverride = null;
194
+ }
195
+ /** Effective minimum level: the runtime override if set, otherwise MinLevel. */
196
+ getLevel() {
197
+ return this.LevelOverride ?? this.MinLevel;
198
+ }
199
+ /** True when a call at `level` should be emitted given the effective level. */
200
+ isEnabled(level) {
201
+ return level >= this.getLevel();
202
+ }
203
+ /**
204
+ * Set a runtime level override. Accepts a {@link LogLevel} or a level name.
205
+ * When `persist` ( default true ) the choice is stored so it survives a
206
+ * browser reload ( no-op on Node ).
207
+ */
208
+ setLevel(level, persist = true) {
209
+ this.LevelOverride = normalizeLevel(level);
210
+ if (persist) {
211
+ (0, persistence_js_1.persistLevel)(this.Name, this.LevelOverride);
212
+ }
213
+ }
214
+ /**
215
+ * Set the override ONLY if nothing is currently applied ( loglevel semantics:
216
+ * a default must never clobber a user's explicit / persisted choice ). Never
217
+ * persists.
218
+ */
219
+ setDefaultLevel(level) {
220
+ if (this.LevelOverride === null) {
221
+ this.LevelOverride = normalizeLevel(level);
222
+ }
223
+ }
224
+ /** Drop the runtime override ( back to MinLevel ) and clear any persisted value. */
225
+ resetLevel() {
226
+ this.LevelOverride = null;
227
+ (0, persistence_js_1.clearPersistedLevel)(this.Name);
228
+ }
229
+ /** Enable every level ( Trace and up ). */
230
+ enableAll(persist = true) {
231
+ this.setLevel(LogLevel.Trace, persist);
232
+ }
233
+ /**
234
+ * Disable every level - even {@link LogLevel.Security} - by raising the
235
+ * override to {@link SILENT_LEVEL} ( one above Security ).
236
+ */
237
+ disableAll(persist = true) {
238
+ this.setLevel(exports.SILENT_LEVEL, persist);
239
+ }
240
+ /**
241
+ * Force-drain THIS logger's targets' buffers ( eg. File / Loki / OTLP batch
242
+ * queues ) so buffered entries are written out. Does NOT close / dispose the
243
+ * target - handle & timer teardown remains the DI container's job. Calling
244
+ * `forceFlush()` on a non-buffered target is a harmless no-op. Guarded so a
245
+ * logger that failed to resolve ( no `Targets` ) is a safe no-op.
246
+ */
247
+ flush() {
248
+ if (!this.Targets || this.Targets.length === 0) {
249
+ return Promise.resolve();
250
+ }
251
+ return Promise.allSettled(this.Targets.map((t) => t.instance.forceFlush())).then(() => undefined);
252
+ }
253
+ /** Flush every registered logger ( best-effort; never rejects ). */
254
+ static flushAll() {
255
+ return Promise.allSettled([...Log.Loggers.values()].map((l) => l.flush())).then(() => undefined);
125
256
  }
126
257
  static clearLoggers() {
127
- return Promise.all([...Log.Loggers.values()].map((l) => l.dispose()))
258
+ // Flush buffered entries out BEFORE tearing loggers down so File / Loki /
259
+ // OTLP data is not lost when teardown does not go through DI container
260
+ // disposal of the target singletons.
261
+ return Log.flushAll()
262
+ .then(() => Promise.all([...Log.Loggers.values()].map((l) => l.dispose())))
128
263
  .then(() => {
129
264
  Log.Loggers.clear();
130
265
  })
@@ -161,6 +296,28 @@ class Log extends di_1.SyncService {
161
296
  this,
162
297
  ]);
163
298
  }
299
+ /**
300
+ * Attach a sink to THIS logger AT RUNTIME ( bunyan `addStream` style ),
301
+ * without going through config. Returns the resolved target instance, or
302
+ * `undefined` when nothing was attached ( eg. `def.enabled === false` ).
303
+ *
304
+ * Default is a safe no-op ( returns `undefined` ) so `Log`-typed references
305
+ * and bootstrap proxies compile; {@link FrameworkLogger } overrides it with
306
+ * the real target-descriptor build + gate recompute.
307
+ */
308
+ addTarget(_def, _opts) {
309
+ return undefined;
310
+ }
311
+ /**
312
+ * Detach a runtime sink by its target `name`, flushing its buffered entries
313
+ * first ( it is NOT disposed - the instance may be DI-owned / shared ).
314
+ * No-op when no target with that name is attached.
315
+ *
316
+ * Default resolves immediately; {@link FrameworkLogger } overrides it.
317
+ */
318
+ removeTarget(_name) {
319
+ return Promise.resolve();
320
+ }
164
321
  }
165
322
  exports.Log = Log;
166
323
  Log.Loggers = new Map();
@@ -200,4 +357,21 @@ function Logger(name, variables) {
200
357
  });
201
358
  };
202
359
  }
360
+ /**
361
+ * Ambient log-context provider seam. A Node-side consumer ( @spinajs/log's
362
+ * LogContext ) registers a function returning the current async-context store;
363
+ * `createLogMessageObject` merges its result at LOWEST precedence so every log
364
+ * entry inherits ambient fields ( eg. requestId ) without threading them by hand.
365
+ *
366
+ * Kept here ( not in @spinajs/log ) so the seam is browser-safe: log-common must
367
+ * stay free of `node:async_hooks`. The default provider returns an empty object;
368
+ * the browser build wires a synchronous fallback instead.
369
+ */
370
+ let logContextProvider = () => ({});
371
+ /**
372
+ * Registers the ambient log-context provider. See {@link logContextProvider}.
373
+ */
374
+ function setLogContextProvider(fn) {
375
+ logContextProvider = fn;
376
+ }
203
377
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { SyncService } from "@spinajs/di";
2
+ /** Kind of a single measurement. */
3
+ export type PerfKind = "span" | "counter" | "value";
4
+ /** One unit of instrumentation, emitted to every registered {@link PerfSink}. */
5
+ export interface IPerfMetric {
6
+ name: string;
7
+ kind: PerfKind;
8
+ /** span duration in ms ( monotonic ). */
9
+ durationMs?: number;
10
+ /** counter delta / recorded value. */
11
+ value?: number;
12
+ /** LOW-cardinality dimensions ( safe as prom labels ). */
13
+ labels?: Record<string, string | number | boolean>;
14
+ /** rich payload for logs only ( sql text, bindings, rows ). Never a prom label. */
15
+ fields?: Record<string, unknown>;
16
+ /** epoch ms when the measurement started. */
17
+ startedAt?: number;
18
+ /** correlation id from the active request scope, when any. */
19
+ requestId?: string;
20
+ /** set when the measured block threw. */
21
+ error?: unknown;
22
+ }
23
+ /** Per-name aggregate inside a {@link IPerfRollup}. */
24
+ export interface IPerfRollupEntry {
25
+ count: number;
26
+ totalMs: number;
27
+ maxMs: number;
28
+ }
29
+ /** One per-request summary, handed to {@link PerfSink.onScopeEnd}. */
30
+ export interface IPerfRollup {
31
+ requestId?: string;
32
+ labels?: Record<string, string | number | boolean>;
33
+ totalMs: number;
34
+ byName: Record<string, IPerfRollupEntry>;
35
+ }
36
+ /** The mutable accumulator kept on the async request store. */
37
+ export interface IPerfScope {
38
+ requestId?: string;
39
+ byName: Record<string, IPerfRollupEntry>;
40
+ }
41
+ /**
42
+ * A receiver of perf measurements. Register a concrete subclass with
43
+ * `@Injectable(PerfSink)` and it is discovered via `Array.ofType(PerfSink)`.
44
+ * `SyncService` ( same base as LogTarget ) so resolution stays synchronous.
45
+ */
46
+ export declare abstract class PerfSink extends SyncService {
47
+ /** Receive one measurement. MUST NOT throw ( the facade guards it ). */
48
+ abstract collect(metric: IPerfMetric): void;
49
+ /** Optional: receive the per-request rollup at scope end. */
50
+ onScopeEnd?(rollup: IPerfRollup): void;
51
+ }
52
+ /** Options accepted by {@link Perf.measure} / {@link Perf.start}. */
53
+ export interface IMeasureOpts {
54
+ labels?: Record<string, string | number | boolean>;
55
+ fields?: Record<string, unknown>;
56
+ }
57
+ /** Handle returned by {@link Perf.start}. */
58
+ export interface IPerfSpan {
59
+ end(fields?: Record<string, unknown>): void;
60
+ }
61
+ /**
62
+ * Seam for the per-request scope. The node `@spinajs/log` package wires this to
63
+ * its AsyncLocalStorage-backed LogContext; the default returns `null` so the
64
+ * facade works ( sans rollups ) with no host — eg. on the browser.
65
+ */
66
+ export interface IPerfScopeBackend {
67
+ get(): IPerfScope | null;
68
+ }
69
+ /** Install the per-request scope backend. See {@link IPerfScopeBackend}. */
70
+ export declare function setPerfScopeBackend(backend: IPerfScopeBackend): void;
71
+ declare class PerfImpl {
72
+ /** Global kill-switch; when false measure/start/count/value are pass-throughs. */
73
+ Enabled: boolean;
74
+ private sinks;
75
+ /** Drop the memoized sink list so the next emit re-resolves ( tests / late registration ). */
76
+ refreshSinks(): void;
77
+ private resolveSinks;
78
+ private emit;
79
+ private accumulate;
80
+ private record;
81
+ /**
82
+ * Time `fn` ( sync or async ), emit a span, and return `fn`'s result. On a
83
+ * thrown error the span is still emitted ( with `error` set ) and the error is
84
+ * rethrown.
85
+ */
86
+ measure<T>(name: string, fn: () => Promise<T> | T, opts?: IMeasureOpts): Promise<T> | T;
87
+ /** Open a manual span; call `end()` where timing stops ( start/end may be far apart ). */
88
+ start(name: string, opts?: IMeasureOpts): IPerfSpan;
89
+ /** Increment a per-request counter ( eg. query count ) and emit a counter metric. */
90
+ count(name: string, delta?: number, labels?: Record<string, string | number | boolean>): void;
91
+ /** Record an absolute value ( gauge-like ) and emit a value metric. */
92
+ value(name: string, n: number, labels?: Record<string, string | number | boolean>): void;
93
+ /**
94
+ * Emit the per-request rollup for `scope` to every sink's `onScopeEnd`. The
95
+ * caller ( http ) passes the scope it read off `req.storage`; `extra` carries
96
+ * request labels and total wall time. No-op when `scope` is null.
97
+ */
98
+ flushScope(scope: IPerfScope | null | undefined, extra?: {
99
+ labels?: Record<string, string | number | boolean>;
100
+ totalMs?: number;
101
+ }): void;
102
+ }
103
+ /**
104
+ * Shared perf-instrumentation facade. Emits measurements to every registered
105
+ * {@link PerfSink}. See the plan / design doc for usage.
106
+ */
107
+ export declare const Perf: PerfImpl;
108
+ export {};
109
+ //# sourceMappingURL=perf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Perf = exports.PerfSink = void 0;
4
+ exports.setPerfScopeBackend = setPerfScopeBackend;
5
+ const di_1 = require("@spinajs/di");
6
+ /**
7
+ * A receiver of perf measurements. Register a concrete subclass with
8
+ * `@Injectable(PerfSink)` and it is discovered via `Array.ofType(PerfSink)`.
9
+ * `SyncService` ( same base as LogTarget ) so resolution stays synchronous.
10
+ */
11
+ class PerfSink extends di_1.SyncService {
12
+ }
13
+ exports.PerfSink = PerfSink;
14
+ const NOOP_BACKEND = { get: () => null };
15
+ let perfScopeBackend = NOOP_BACKEND;
16
+ /** Install the per-request scope backend. See {@link IPerfScopeBackend}. */
17
+ function setPerfScopeBackend(backend) {
18
+ perfScopeBackend = backend ?? NOOP_BACKEND;
19
+ }
20
+ class PerfImpl {
21
+ constructor() {
22
+ /** Global kill-switch; when false measure/start/count/value are pass-throughs. */
23
+ this.Enabled = true;
24
+ this.sinks = null;
25
+ }
26
+ /** Drop the memoized sink list so the next emit re-resolves ( tests / late registration ). */
27
+ refreshSinks() {
28
+ this.sinks = null;
29
+ }
30
+ resolveSinks() {
31
+ if (this.sinks === null) {
32
+ // PerfSink extends SyncService => resolve returns synchronously.
33
+ this.sinks = di_1.DI.resolve(Array.ofType(PerfSink)) ?? [];
34
+ }
35
+ return this.sinks;
36
+ }
37
+ emit(metric) {
38
+ for (const s of this.resolveSinks()) {
39
+ try {
40
+ s.collect(metric);
41
+ }
42
+ catch {
43
+ /* a sink must never break the measured code or sibling sinks */
44
+ }
45
+ }
46
+ }
47
+ accumulate(name, durationMs, scope) {
48
+ if (!scope)
49
+ return;
50
+ const e = scope.byName[name] ?? (scope.byName[name] = { count: 0, totalMs: 0, maxMs: 0 });
51
+ e.count += 1;
52
+ e.totalMs += durationMs;
53
+ if (durationMs > e.maxMs)
54
+ e.maxMs = durationMs;
55
+ }
56
+ record(name, startedAt, durationMs, opts, error) {
57
+ const scope = perfScopeBackend.get();
58
+ this.accumulate(name, durationMs, scope);
59
+ this.emit({
60
+ name,
61
+ kind: "span",
62
+ durationMs,
63
+ labels: opts?.labels,
64
+ fields: error !== undefined ? { ...(opts?.fields ?? {}), error } : opts?.fields,
65
+ startedAt,
66
+ requestId: scope?.requestId,
67
+ error,
68
+ });
69
+ }
70
+ /**
71
+ * Time `fn` ( sync or async ), emit a span, and return `fn`'s result. On a
72
+ * thrown error the span is still emitted ( with `error` set ) and the error is
73
+ * rethrown.
74
+ */
75
+ measure(name, fn, opts) {
76
+ if (!this.Enabled)
77
+ return fn();
78
+ const startedAt = Date.now();
79
+ const t0 = performance.now();
80
+ let out;
81
+ try {
82
+ out = fn();
83
+ }
84
+ catch (err) {
85
+ this.record(name, startedAt, performance.now() - t0, opts, err);
86
+ throw err;
87
+ }
88
+ if (out !== null && typeof out?.then === "function") {
89
+ return out.then((v) => {
90
+ this.record(name, startedAt, performance.now() - t0, opts, undefined);
91
+ return v;
92
+ }, (err) => {
93
+ this.record(name, startedAt, performance.now() - t0, opts, err);
94
+ throw err;
95
+ });
96
+ }
97
+ this.record(name, startedAt, performance.now() - t0, opts, undefined);
98
+ return out;
99
+ }
100
+ /** Open a manual span; call `end()` where timing stops ( start/end may be far apart ). */
101
+ start(name, opts) {
102
+ const startedAt = Date.now();
103
+ const t0 = performance.now();
104
+ let ended = false;
105
+ return {
106
+ end: (fields) => {
107
+ if (ended)
108
+ return;
109
+ ended = true;
110
+ const merged = fields ? { labels: opts?.labels, fields: { ...(opts?.fields ?? {}), ...fields } } : opts ?? {};
111
+ this.record(name, startedAt, performance.now() - t0, merged, undefined);
112
+ },
113
+ };
114
+ }
115
+ /** Increment a per-request counter ( eg. query count ) and emit a counter metric. */
116
+ count(name, delta = 1, labels) {
117
+ if (!this.Enabled)
118
+ return;
119
+ const scope = perfScopeBackend.get();
120
+ if (scope) {
121
+ const e = scope.byName[name] ?? (scope.byName[name] = { count: 0, totalMs: 0, maxMs: 0 });
122
+ e.count += delta;
123
+ }
124
+ this.emit({ name, kind: "counter", value: delta, labels, requestId: scope?.requestId });
125
+ }
126
+ /** Record an absolute value ( gauge-like ) and emit a value metric. */
127
+ value(name, n, labels) {
128
+ if (!this.Enabled)
129
+ return;
130
+ const scope = perfScopeBackend.get();
131
+ this.emit({ name, kind: "value", value: n, labels, requestId: scope?.requestId });
132
+ }
133
+ /**
134
+ * Emit the per-request rollup for `scope` to every sink's `onScopeEnd`. The
135
+ * caller ( http ) passes the scope it read off `req.storage`; `extra` carries
136
+ * request labels and total wall time. No-op when `scope` is null.
137
+ */
138
+ flushScope(scope, extra) {
139
+ if (!scope)
140
+ return;
141
+ const rollup = {
142
+ requestId: scope.requestId,
143
+ labels: extra?.labels,
144
+ totalMs: extra?.totalMs ?? 0,
145
+ byName: scope.byName,
146
+ };
147
+ for (const sink of this.resolveSinks()) {
148
+ try {
149
+ sink.onScopeEnd?.(rollup);
150
+ }
151
+ catch {
152
+ /* isolate */
153
+ }
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Shared perf-instrumentation facade. Emits measurements to every registered
159
+ * {@link PerfSink}. See the plan / design doc for usage.
160
+ */
161
+ exports.Perf = new PerfImpl();
162
+ //# sourceMappingURL=perf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { LogLevel } from "./index.js";
2
+ /**
3
+ * Persist `level` for `loggerName`. Browser only - writes `String(level)` to
4
+ * localStorage under `spinajs:log:level:<loggerName>`, falling back to a cookie
5
+ * when storage throws. No-op on Node.
6
+ */
7
+ export declare function persistLevel(loggerName: string, level: LogLevel): void;
8
+ /**
9
+ * Read back the persisted level for `loggerName` ( localStorage then cookie ).
10
+ * Returns a finite {@link LogLevel} number, or `undefined` when nothing valid is
11
+ * stored. Always `undefined` on Node.
12
+ */
13
+ export declare function readPersistedLevel(loggerName: string): LogLevel | undefined;
14
+ /**
15
+ * Remove any persisted level for `loggerName` ( localStorage + cookie ). No-op
16
+ * on Node.
17
+ */
18
+ export declare function clearPersistedLevel(loggerName: string): void;
19
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmE3C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAmBtE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA0B3E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAgB5D"}