@dxos/log 0.8.4-main.fbb7a13 → 0.8.4-main.fcc0d83b33

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/dist/lib/browser/chunk-V7FYKT4H.mjs +311 -0
  2. package/dist/lib/browser/chunk-V7FYKT4H.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +236 -43
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/platform/node/index.mjs +1 -1
  7. package/dist/lib/browser/platform/node/index.mjs.map +3 -3
  8. package/dist/lib/browser/processors/console-processor.mjs +6 -11
  9. package/dist/lib/browser/processors/console-processor.mjs.map +3 -3
  10. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs +313 -0
  11. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +236 -43
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/platform/node/index.mjs +1 -1
  16. package/dist/lib/node-esm/platform/node/index.mjs.map +3 -3
  17. package/dist/lib/node-esm/processors/console-processor.mjs +6 -11
  18. package/dist/lib/node-esm/processors/console-processor.mjs.map +3 -3
  19. package/dist/types/src/context.d.ts +78 -2
  20. package/dist/types/src/context.d.ts.map +1 -1
  21. package/dist/types/src/dbg.d.ts +23 -0
  22. package/dist/types/src/dbg.d.ts.map +1 -0
  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 +7 -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 +4 -9
  52. package/src/context.ts +242 -2
  53. package/src/dbg.ts +34 -0
  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 +7 -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,30 +22,139 @@ __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,
27
31
  createLog: () => createLog,
32
+ dbg: () => dbg,
28
33
  debug: () => debug,
29
34
  gatherLogInfoFromScope: () => gatherLogInfoFromScope,
30
35
  getContextFromEntry: () => getContextFromEntry,
31
36
  getCurrentOwnershipScope: () => getCurrentOwnershipScope,
32
37
  getRelativeFilename: () => getRelativeFilename,
38
+ inferEnvironmentName: () => inferEnvironmentName,
39
+ isLogMeta: () => isLogMeta,
33
40
  levels: () => levels,
34
41
  log: () => log,
35
42
  logInfo: () => logInfo,
36
43
  omit: () => omit,
37
44
  parseFilter: () => parseFilter,
38
45
  pick: () => pick,
46
+ serializeToJsonl: () => serializeToJsonl,
39
47
  shortLevelName: () => shortLevelName,
40
48
  shouldLog: () => shouldLog
41
49
  });
42
- import omit from "lodash.omit";
43
- 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
+ };
44
154
 
45
155
  // src/decorators.ts
46
- import { inspect } from "node:util";
47
156
  import chalk from "chalk";
157
+ import { inspect } from "node:util";
48
158
  var nextPromiseId = 0;
49
159
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
50
160
  const method = descriptor.value;
@@ -170,15 +280,7 @@ __export(processors_exports, {
170
280
  });
171
281
 
172
282
  // src/processors/browser-processor.ts
173
- import { getDebugName, safariCheck } from "@dxos/util";
174
- var getRelativeFilename2 = (filename) => {
175
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
176
- if (match) {
177
- const [, filePath] = match;
178
- return filePath;
179
- }
180
- return filename;
181
- };
283
+ import { safariCheck } from "@dxos/util";
182
284
  var CONFIG = {
183
285
  useTestProcessor: false,
184
286
  printFileLinks: false
@@ -189,18 +291,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
189
291
  }
190
292
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
191
293
  const LOG_BROWSER_CSS = [];
294
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
192
295
  let link = "";
193
- if (entry.meta) {
194
- const filename = getRelativeFilename2(entry.meta.F);
296
+ if (filename !== void 0 && lineNumber !== void 0) {
195
297
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
196
- link = `${filepath}#L${entry.meta.L}`;
298
+ link = `${filepath}#L${lineNumber}`;
197
299
  }
198
300
  let args = [];
199
- if (entry.meta?.S) {
200
- const scope = entry.meta?.S;
201
- const scopeName = scope.name || getDebugName(scope);
202
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
203
- 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
+ }
204
308
  }
205
309
  if (entry.message) {
206
310
  args.push(entry.message);
@@ -208,9 +312,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
208
312
  const context = getContextFromEntry(entry);
209
313
  if (context) {
210
314
  if (Object.keys(context).length === 1 && "error" in context) {
211
- args.push(context.error);
315
+ args.push(unwrapEffectError(context.error));
212
316
  } else if (Object.keys(context).length === 1 && "err" in context) {
213
- args.push(context.err);
317
+ args.push(unwrapEffectError(context.err));
214
318
  } else {
215
319
  args.push(context);
216
320
  }
@@ -245,10 +349,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
245
349
  if (!shouldLog(entry, config.filters)) {
246
350
  return;
247
351
  }
248
- let path = "";
249
- if (entry.meta) {
250
- path = `${getRelativeFilename2(entry.meta.F)}:${entry.meta.L}`;
251
- }
352
+ const { filename, line: lineNumber } = entry.computedMeta;
353
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
252
354
  let args = [];
253
355
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
254
356
  args.push(`${processPrefix}${entry.message}`);
@@ -275,6 +377,13 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
275
377
  }
276
378
  };
277
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
+ };
278
387
 
279
388
  // src/processors/index.ts
280
389
  __reExport(processors_exports, console_processor_star);
@@ -289,7 +398,6 @@ var DEBUG_PROCESSOR = (config, entry) => {
289
398
  // src/processors/file-processor.ts
290
399
  import { appendFileSync, mkdirSync, openSync } from "node:fs";
291
400
  import { dirname } from "node:path";
292
- import { jsonlogify } from "@dxos/util";
293
401
  var EAGAIN_MAX_DURATION = 1e3;
294
402
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
295
403
  let fd;
@@ -310,15 +418,12 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
310
418
  fd = openSync(pathOrFd, "a");
311
419
  }
312
420
  const record = {
313
- ...entry,
314
- timestamp: Date.now(),
315
- ...entry.meta ? {
316
- meta: {
317
- file: getRelativeFilename(entry.meta.F),
318
- line: entry.meta.L
319
- }
320
- } : {},
321
- 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
322
427
  };
323
428
  let retryTS = 0;
324
429
  while (true) {
@@ -417,13 +522,14 @@ var createLog = () => {
417
522
  get: () => log2._config
418
523
  });
419
524
  const processLog = (level, message, context = {}, meta, error) => {
420
- log2._config.processors.forEach((processor) => processor(log2._config, {
525
+ const entry = new LogEntry({
421
526
  level,
422
527
  message,
423
528
  context,
424
529
  meta,
425
530
  error
426
- }));
531
+ });
532
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
427
533
  };
428
534
  Object.assign(log2, {
429
535
  /**
@@ -431,7 +537,7 @@ var createLog = () => {
431
537
  * NOTE: Preserves any processors that were already added to this logger instance
432
538
  * unless an explicit processor option is provided.
433
539
  */
434
- config: ({ processor, ...options }) => {
540
+ config: ({ processor, ...options } = {}) => {
435
541
  const config = createConfig(options);
436
542
  const processors2 = processor ? config.processors : log2._config.processors;
437
543
  log2._config = {
@@ -488,11 +594,91 @@ var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("
488
594
  // src/index.ts
489
595
  __reExport(index_exports, processors_exports);
490
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
+
603
+ // src/dbg.ts
604
+ var dbg = (arg, meta) => {
605
+ if (meta?.A) {
606
+ console.log(`${meta.A[0]} =`, arg);
607
+ } else {
608
+ console.log(arg);
609
+ }
610
+ return arg;
611
+ };
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
+
491
679
  // src/experimental/ownership.ts
492
680
  import { inspect as inspect3 } from "node:util";
493
- var kOwnershipScope = Symbol("kOwnershipScope");
494
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
495
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
681
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
496
682
  var OwnershipScope = class {
497
683
  constr;
498
684
  parent;
@@ -525,21 +711,28 @@ export {
525
711
  BROWSER_PROCESSOR,
526
712
  DEBUG_PROCESSOR,
527
713
  FILE_PROCESSOR,
714
+ LOG_META_MARKER,
715
+ LogBuffer,
716
+ LogEntry,
528
717
  LogLevel,
529
718
  LogProcessorType,
530
719
  createFileProcessor,
531
720
  createLog,
721
+ dbg,
532
722
  debug,
533
723
  gatherLogInfoFromScope,
534
724
  getContextFromEntry,
535
725
  getCurrentOwnershipScope,
536
726
  getRelativeFilename,
727
+ inferEnvironmentName,
728
+ isLogMeta,
537
729
  levels,
538
730
  log,
539
731
  logInfo,
540
732
  omit,
541
733
  parseFilter,
542
734
  pick,
735
+ serializeToJsonl,
543
736
  shortLevelName,
544
737
  shouldLog
545
738
  };