@dxos/log 0.8.4-main.ef1bc66f44 → 0.8.4-main.f466a3d56e

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 (73) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/chunk-V7FYKT4H.mjs +311 -0
  3. package/dist/lib/browser/chunk-V7FYKT4H.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +224 -43
  5. package/dist/lib/browser/index.mjs.map +4 -4
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/platform/node/index.mjs +1 -1
  8. package/dist/lib/browser/platform/node/index.mjs.map +3 -3
  9. package/dist/lib/browser/processors/console-processor.mjs +6 -11
  10. package/dist/lib/browser/processors/console-processor.mjs.map +3 -3
  11. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs +313 -0
  12. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs.map +7 -0
  13. package/dist/lib/node-esm/index.mjs +224 -43
  14. package/dist/lib/node-esm/index.mjs.map +4 -4
  15. package/dist/lib/node-esm/meta.json +1 -1
  16. package/dist/lib/node-esm/platform/node/index.mjs +1 -1
  17. package/dist/lib/node-esm/platform/node/index.mjs.map +3 -3
  18. package/dist/lib/node-esm/processors/console-processor.mjs +6 -11
  19. package/dist/lib/node-esm/processors/console-processor.mjs.map +3 -3
  20. package/dist/types/src/context.d.ts +78 -2
  21. package/dist/types/src/context.d.ts.map +1 -1
  22. package/dist/types/src/dbg.d.ts.map +1 -1
  23. package/dist/types/src/decorators.d.ts.map +1 -1
  24. package/dist/types/src/environment.d.ts +24 -0
  25. package/dist/types/src/environment.d.ts.map +1 -0
  26. package/dist/types/src/environment.test.d.ts +2 -0
  27. package/dist/types/src/environment.test.d.ts.map +1 -0
  28. package/dist/types/src/experimental/ownership.d.ts.map +1 -1
  29. package/dist/types/src/index.d.ts +6 -3
  30. package/dist/types/src/index.d.ts.map +1 -1
  31. package/dist/types/src/jsonl.d.ts +53 -0
  32. package/dist/types/src/jsonl.d.ts.map +1 -0
  33. package/dist/types/src/jsonl.test.d.ts +2 -0
  34. package/dist/types/src/jsonl.test.d.ts.map +1 -0
  35. package/dist/types/src/log-buffer.d.ts +20 -0
  36. package/dist/types/src/log-buffer.d.ts.map +1 -0
  37. package/dist/types/src/log-buffer.test.d.ts +2 -0
  38. package/dist/types/src/log-buffer.test.d.ts.map +1 -0
  39. package/dist/types/src/log.d.ts +44 -1
  40. package/dist/types/src/log.d.ts.map +1 -1
  41. package/dist/types/src/meta.d.ts +20 -1
  42. package/dist/types/src/meta.d.ts.map +1 -1
  43. package/dist/types/src/platform/browser/index.d.ts.map +1 -1
  44. package/dist/types/src/platform/node/index.d.ts.map +1 -1
  45. package/dist/types/src/processors/browser-processor.d.ts.map +1 -1
  46. package/dist/types/src/processors/common.d.ts.map +1 -1
  47. package/dist/types/src/processors/console-processor.d.ts.map +1 -1
  48. package/dist/types/src/processors/file-processor.d.ts.map +1 -1
  49. package/dist/types/src/scope.d.ts.map +1 -1
  50. package/dist/types/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +5 -10
  52. package/src/context.ts +242 -2
  53. package/src/dbg.ts +0 -1
  54. package/src/decorators.ts +1 -2
  55. package/src/environment.test.ts +222 -0
  56. package/src/environment.ts +129 -0
  57. package/src/experimental/classes.test.ts +0 -1
  58. package/src/index.ts +6 -4
  59. package/src/jsonl.test.ts +121 -0
  60. package/src/jsonl.ts +104 -0
  61. package/src/log-buffer.test.ts +158 -0
  62. package/src/log-buffer.ts +89 -0
  63. package/src/log.test.ts +0 -1
  64. package/src/log.ts +56 -12
  65. package/src/meta.ts +29 -1
  66. package/src/platform/node/index.ts +1 -2
  67. package/src/processors/browser-processor.ts +27 -28
  68. package/src/processors/console-processor.ts +5 -13
  69. package/src/processors/file-processor.ts +7 -9
  70. package/dist/lib/browser/chunk-GPOFUMLO.mjs +0 -133
  71. package/dist/lib/browser/chunk-GPOFUMLO.mjs.map +0 -7
  72. package/dist/lib/node-esm/chunk-QPYJZ4SO.mjs +0 -135
  73. package/dist/lib/node-esm/chunk-QPYJZ4SO.mjs.map +0 -7
@@ -1,5 +1,6 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
+ LogEntry,
3
4
  LogLevel,
4
5
  LogProcessorType,
5
6
  gatherLogInfoFromScope,
@@ -9,7 +10,7 @@ import {
9
10
  logInfo,
10
11
  shortLevelName,
11
12
  shouldLog
12
- } from "./chunk-QPYJZ4SO.mjs";
13
+ } from "./chunk-5TBDXMQF.mjs";
13
14
  import {
14
15
  __export,
15
16
  __reExport
@@ -21,6 +22,9 @@ __export(index_exports, {
21
22
  BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
22
23
  DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
23
24
  FILE_PROCESSOR: () => FILE_PROCESSOR,
25
+ LOG_META_MARKER: () => LOG_META_MARKER,
26
+ LogBuffer: () => LogBuffer,
27
+ LogEntry: () => LogEntry,
24
28
  LogLevel: () => LogLevel,
25
29
  LogProcessorType: () => LogProcessorType,
26
30
  createFileProcessor: () => createFileProcessor,
@@ -31,21 +35,126 @@ __export(index_exports, {
31
35
  getContextFromEntry: () => getContextFromEntry,
32
36
  getCurrentOwnershipScope: () => getCurrentOwnershipScope,
33
37
  getRelativeFilename: () => getRelativeFilename,
38
+ inferEnvironmentName: () => inferEnvironmentName,
39
+ isLogMeta: () => isLogMeta,
34
40
  levels: () => levels,
35
41
  log: () => log,
36
42
  logInfo: () => logInfo,
37
43
  omit: () => omit,
38
44
  parseFilter: () => parseFilter,
39
45
  pick: () => pick,
46
+ serializeToJsonl: () => serializeToJsonl,
40
47
  shortLevelName: () => shortLevelName,
41
48
  shouldLog: () => shouldLog
42
49
  });
43
- import omit from "lodash.omit";
44
- import { pick } from "@dxos/util";
50
+ import { omit, pick } from "@dxos/util";
51
+
52
+ // src/environment.ts
53
+ var TAB_SUFFIX_STORAGE_KEY = "@dxos/log:env-suffix";
54
+ var SUFFIX_LENGTH = 6;
55
+ var randomSuffix = () => {
56
+ const cryptoRef = globalThis.crypto;
57
+ if (cryptoRef?.getRandomValues) {
58
+ const bytes = new Uint8Array(SUFFIX_LENGTH);
59
+ cryptoRef.getRandomValues(bytes);
60
+ let suffix = "";
61
+ for (const byte of bytes) {
62
+ suffix += (byte % 36).toString(36);
63
+ }
64
+ return suffix;
65
+ }
66
+ return Math.random().toString(36).slice(2, 2 + SUFFIX_LENGTH).padEnd(SUFFIX_LENGTH, "0");
67
+ };
68
+ var getOrCreateTabSuffix = (session) => {
69
+ if (!session) {
70
+ return randomSuffix();
71
+ }
72
+ try {
73
+ const existing = session.getItem(TAB_SUFFIX_STORAGE_KEY);
74
+ if (existing && existing.length > 0) {
75
+ return existing;
76
+ }
77
+ const suffix = randomSuffix();
78
+ session.setItem(TAB_SUFFIX_STORAGE_KEY, suffix);
79
+ return suffix;
80
+ } catch {
81
+ return randomSuffix();
82
+ }
83
+ };
84
+ var isInstanceOf = (scope, ctorName) => {
85
+ const ctor = scope?.[ctorName];
86
+ return typeof ctor === "function" && scope instanceof ctor;
87
+ };
88
+ var CF_WORKER_USER_AGENT = "Cloudflare-Workers";
89
+ var inferEnvironmentName = (options = {}) => {
90
+ const scope = options.scope ?? globalThis;
91
+ if (scope.navigator?.userAgent === CF_WORKER_USER_AGENT) {
92
+ return `cf-worker::${randomSuffix()}`;
93
+ }
94
+ if (isInstanceOf(scope, "SharedWorkerGlobalScope")) {
95
+ return `shared-worker:${scope.name ?? ""}:${randomSuffix()}`;
96
+ }
97
+ if (isInstanceOf(scope, "ServiceWorkerGlobalScope")) {
98
+ return `service-worker::${randomSuffix()}`;
99
+ }
100
+ if (isInstanceOf(scope, "DedicatedWorkerGlobalScope")) {
101
+ return `dedicated-worker:${scope.name ?? ""}:${randomSuffix()}`;
102
+ }
103
+ if (scope.window !== void 0 && scope.window === scope) {
104
+ const origin = scope.location?.origin ?? "";
105
+ return `tab:${origin}:${getOrCreateTabSuffix(scope.sessionStorage)}`;
106
+ }
107
+ const proc = scope.process;
108
+ if (proc && typeof proc === "object" && proc.versions?.node) {
109
+ const pid = typeof proc.pid === "number" ? String(proc.pid) : "";
110
+ return `node:${pid}:${randomSuffix()}`;
111
+ }
112
+ return `unknown::${randomSuffix()}`;
113
+ };
114
+
115
+ // src/jsonl.ts
116
+ var serializeToJsonl = (entry, opts = {}) => {
117
+ if (entry.level <= LogLevel.TRACE) {
118
+ return void 0;
119
+ }
120
+ const { filename, line, context: scopeName } = entry.computedMeta;
121
+ const record = {
122
+ t: new Date(entry.timestamp).toISOString(),
123
+ l: shortLevelName[entry.level] ?? "?",
124
+ m: entry.message ?? ""
125
+ };
126
+ if (filename !== void 0) {
127
+ record.f = filename;
128
+ }
129
+ if (line !== void 0) {
130
+ record.n = line;
131
+ }
132
+ if (scopeName !== void 0) {
133
+ record.o = scopeName;
134
+ }
135
+ if (entry.computedError !== void 0) {
136
+ record.e = entry.computedError;
137
+ }
138
+ if (opts.env !== void 0) {
139
+ record.i = opts.env;
140
+ }
141
+ const computedContext = entry.computedContext;
142
+ if (Object.keys(computedContext).length > 0) {
143
+ try {
144
+ record.c = JSON.stringify(computedContext);
145
+ } catch {
146
+ }
147
+ }
148
+ try {
149
+ return JSON.stringify(record);
150
+ } catch {
151
+ return void 0;
152
+ }
153
+ };
45
154
 
46
155
  // src/decorators.ts
47
- import { inspect } from "node:util";
48
156
  import chalk from "chalk";
157
+ import { inspect } from "node:util";
49
158
  var nextPromiseId = 0;
50
159
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
51
160
  const method = descriptor.value;
@@ -171,15 +280,7 @@ __export(processors_exports, {
171
280
  });
172
281
 
173
282
  // src/processors/browser-processor.ts
174
- import { getDebugName, safariCheck } from "@dxos/util";
175
- var getRelativeFilename2 = (filename) => {
176
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
177
- if (match) {
178
- const [, filePath] = match;
179
- return filePath;
180
- }
181
- return filename;
182
- };
283
+ import { safariCheck } from "@dxos/util";
183
284
  var CONFIG = {
184
285
  useTestProcessor: false,
185
286
  printFileLinks: false
@@ -190,18 +291,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
190
291
  }
191
292
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
192
293
  const LOG_BROWSER_CSS = [];
294
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
193
295
  let link = "";
194
- if (entry.meta) {
195
- const filename = getRelativeFilename2(entry.meta.F);
296
+ if (filename !== void 0 && lineNumber !== void 0) {
196
297
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
197
- link = `${filepath}#L${entry.meta.L}`;
298
+ link = `${filepath}#L${lineNumber}`;
198
299
  }
199
300
  let args = [];
200
- if (entry.meta?.S) {
201
- const scope = entry.meta?.S;
202
- const scopeName = scope.name || getDebugName(scope);
203
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
204
- args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
301
+ const scope = entry.meta?.S;
302
+ if (scope) {
303
+ const scopeName = scope.name || scopeDebugName;
304
+ if (scopeName) {
305
+ const processPrefix = scope.hostSessionId ? "[worker] " : "";
306
+ args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
307
+ }
205
308
  }
206
309
  if (entry.message) {
207
310
  args.push(entry.message);
@@ -209,9 +312,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
209
312
  const context = getContextFromEntry(entry);
210
313
  if (context) {
211
314
  if (Object.keys(context).length === 1 && "error" in context) {
212
- args.push(context.error);
315
+ args.push(unwrapEffectError(context.error));
213
316
  } else if (Object.keys(context).length === 1 && "err" in context) {
214
- args.push(context.err);
317
+ args.push(unwrapEffectError(context.err));
215
318
  } else {
216
319
  args.push(context);
217
320
  }
@@ -246,10 +349,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
246
349
  if (!shouldLog(entry, config.filters)) {
247
350
  return;
248
351
  }
249
- let path = "";
250
- if (entry.meta) {
251
- path = `${getRelativeFilename2(entry.meta.F)}:${entry.meta.L}`;
252
- }
352
+ const { filename, line: lineNumber } = entry.computedMeta;
353
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
253
354
  let args = [];
254
355
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
255
356
  args.push(`${processPrefix}${entry.message}`);
@@ -276,6 +377,13 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
276
377
  }
277
378
  };
278
379
  var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;
380
+ var originalSymbol = /* @__PURE__ */ Symbol.for("effect/OriginalAnnotation");
381
+ var unwrapEffectError = (error) => {
382
+ if (typeof error === "object" && error !== null && originalSymbol in error) {
383
+ return error[originalSymbol];
384
+ }
385
+ return error;
386
+ };
279
387
 
280
388
  // src/processors/index.ts
281
389
  __reExport(processors_exports, console_processor_star);
@@ -290,7 +398,6 @@ var DEBUG_PROCESSOR = (config, entry) => {
290
398
  // src/processors/file-processor.ts
291
399
  import { appendFileSync, mkdirSync, openSync } from "node:fs";
292
400
  import { dirname } from "node:path";
293
- import { jsonlogify } from "@dxos/util";
294
401
  var EAGAIN_MAX_DURATION = 1e3;
295
402
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
296
403
  let fd;
@@ -311,15 +418,12 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
311
418
  fd = openSync(pathOrFd, "a");
312
419
  }
313
420
  const record = {
314
- ...entry,
315
- timestamp: Date.now(),
316
- ...entry.meta ? {
317
- meta: {
318
- file: getRelativeFilename(entry.meta.F),
319
- line: entry.meta.L
320
- }
321
- } : {},
322
- context: jsonlogify(getContextFromEntry(entry))
421
+ level: entry.level,
422
+ message: entry.message,
423
+ timestamp: entry.timestamp,
424
+ meta: entry.computedMeta,
425
+ context: entry.computedContext,
426
+ error: entry.computedError
323
427
  };
324
428
  let retryTS = 0;
325
429
  while (true) {
@@ -418,13 +522,14 @@ var createLog = () => {
418
522
  get: () => log2._config
419
523
  });
420
524
  const processLog = (level, message, context = {}, meta, error) => {
421
- log2._config.processors.forEach((processor) => processor(log2._config, {
525
+ const entry = new LogEntry({
422
526
  level,
423
527
  message,
424
528
  context,
425
529
  meta,
426
530
  error
427
- }));
531
+ });
532
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
428
533
  };
429
534
  Object.assign(log2, {
430
535
  /**
@@ -432,7 +537,7 @@ var createLog = () => {
432
537
  * NOTE: Preserves any processors that were already added to this logger instance
433
538
  * unless an explicit processor option is provided.
434
539
  */
435
- config: ({ processor, ...options }) => {
540
+ config: ({ processor, ...options } = {}) => {
436
541
  const config = createConfig(options);
437
542
  const processors2 = processor ? config.processors : log2._config.processors;
438
543
  log2._config = {
@@ -489,6 +594,12 @@ var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("
489
594
  // src/index.ts
490
595
  __reExport(index_exports, processors_exports);
491
596
 
597
+ // src/meta.ts
598
+ var LOG_META_MARKER = "~LogMeta";
599
+ var isLogMeta = (value) => {
600
+ return value != null && typeof value === "object" && value[LOG_META_MARKER] === LOG_META_MARKER;
601
+ };
602
+
492
603
  // src/dbg.ts
493
604
  var dbg = (arg, meta) => {
494
605
  if (meta?.A) {
@@ -499,11 +610,75 @@ var dbg = (arg, meta) => {
499
610
  return arg;
500
611
  };
501
612
 
613
+ // src/log-buffer.ts
614
+ import { CircularBuffer } from "@dxos/util";
615
+ var DEFAULT_BUFFER_SIZE = 2e3;
616
+ var MAX_CONTEXT_LENGTH = 500;
617
+ var LogBuffer = class {
618
+ _buffer;
619
+ constructor(size = DEFAULT_BUFFER_SIZE) {
620
+ this._buffer = new CircularBuffer(size);
621
+ }
622
+ /**
623
+ * Log processor that can be registered with `log.runtimeConfig.processors`.
624
+ * Captures every level except TRACE (does not apply `shouldLog` / filter; use for full debug dumps).
625
+ */
626
+ logProcessor = (_config, entry) => {
627
+ if (entry.level <= LogLevel.TRACE) {
628
+ return;
629
+ }
630
+ const { filename, line, context: scopeName } = entry.computedMeta;
631
+ const record = {
632
+ t: new Date(entry.timestamp).toISOString(),
633
+ l: shortLevelName[entry.level] ?? "?",
634
+ m: entry.message ?? ""
635
+ };
636
+ if (filename !== void 0) {
637
+ record.f = filename;
638
+ }
639
+ if (line !== void 0) {
640
+ record.n = line;
641
+ }
642
+ if (scopeName !== void 0) {
643
+ record.o = scopeName;
644
+ }
645
+ if (entry.computedError !== void 0) {
646
+ record.e = entry.computedError;
647
+ }
648
+ const computedContext = entry.computedContext;
649
+ if (Object.keys(computedContext).length > 0) {
650
+ try {
651
+ let json = JSON.stringify(computedContext);
652
+ if (json.length > MAX_CONTEXT_LENGTH) {
653
+ json = json.slice(0, MAX_CONTEXT_LENGTH);
654
+ }
655
+ record.c = json;
656
+ } catch {
657
+ }
658
+ }
659
+ this._buffer.push(record);
660
+ };
661
+ /** Number of entries currently in the buffer. */
662
+ get size() {
663
+ return this._buffer.elementCount;
664
+ }
665
+ /** Discard all buffered entries. */
666
+ clear() {
667
+ this._buffer.clear();
668
+ }
669
+ /** Serialize buffer contents as NDJSON (newline-delimited JSON). */
670
+ serialize() {
671
+ const lines = [];
672
+ for (const record of this._buffer) {
673
+ lines.push(JSON.stringify(record));
674
+ }
675
+ return lines.join("\n");
676
+ }
677
+ };
678
+
502
679
  // src/experimental/ownership.ts
503
680
  import { inspect as inspect3 } from "node:util";
504
- var kOwnershipScope = Symbol("kOwnershipScope");
505
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
506
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
681
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
507
682
  var OwnershipScope = class {
508
683
  constr;
509
684
  parent;
@@ -536,6 +711,9 @@ export {
536
711
  BROWSER_PROCESSOR,
537
712
  DEBUG_PROCESSOR,
538
713
  FILE_PROCESSOR,
714
+ LOG_META_MARKER,
715
+ LogBuffer,
716
+ LogEntry,
539
717
  LogLevel,
540
718
  LogProcessorType,
541
719
  createFileProcessor,
@@ -546,12 +724,15 @@ export {
546
724
  getContextFromEntry,
547
725
  getCurrentOwnershipScope,
548
726
  getRelativeFilename,
727
+ inferEnvironmentName,
728
+ isLogMeta,
549
729
  levels,
550
730
  log,
551
731
  logInfo,
552
732
  omit,
553
733
  parseFilter,
554
734
  pick,
735
+ serializeToJsonl,
555
736
  shortLevelName,
556
737
  shouldLog
557
738
  };