@dxos/log 0.8.4-main.fffef41 → 0.8.4-staging.60fe92afc8

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 (94) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/chunk-IEP6GGEX.mjs +23 -0
  3. package/dist/lib/browser/chunk-IEP6GGEX.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-V7FYKT4H.mjs +311 -0
  5. package/dist/lib/browser/chunk-V7FYKT4H.mjs.map +7 -0
  6. package/dist/lib/browser/index.mjs +278 -244
  7. package/dist/lib/browser/index.mjs.map +4 -4
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/platform/browser/index.mjs +26 -0
  10. package/dist/lib/browser/platform/browser/index.mjs.map +7 -0
  11. package/dist/lib/browser/platform/node/index.mjs +21 -0
  12. package/dist/lib/browser/platform/node/index.mjs.map +7 -0
  13. package/dist/lib/browser/processors/console-processor.mjs +102 -0
  14. package/dist/lib/browser/processors/console-processor.mjs.map +7 -0
  15. package/dist/lib/browser/processors/console-stub.mjs +9 -0
  16. package/dist/lib/browser/processors/console-stub.mjs.map +7 -0
  17. package/dist/lib/browser/processors/file-processor.mjs +75 -0
  18. package/dist/lib/browser/processors/file-processor.mjs.map +7 -0
  19. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  20. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  21. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs +313 -0
  22. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs.map +7 -0
  23. package/dist/lib/node-esm/index.mjs +280 -333
  24. package/dist/lib/node-esm/index.mjs.map +4 -4
  25. package/dist/lib/node-esm/meta.json +1 -1
  26. package/dist/lib/node-esm/platform/browser/index.mjs +27 -0
  27. package/dist/lib/node-esm/platform/browser/index.mjs.map +7 -0
  28. package/dist/lib/node-esm/platform/node/index.mjs +22 -0
  29. package/dist/lib/node-esm/platform/node/index.mjs.map +7 -0
  30. package/dist/lib/node-esm/processors/console-processor.mjs +103 -0
  31. package/dist/lib/node-esm/processors/console-processor.mjs.map +7 -0
  32. package/dist/lib/node-esm/processors/console-stub.mjs +10 -0
  33. package/dist/lib/node-esm/processors/console-stub.mjs.map +7 -0
  34. package/dist/lib/node-esm/processors/file-processor.mjs +76 -0
  35. package/dist/lib/node-esm/processors/file-processor.mjs.map +7 -0
  36. package/dist/types/src/context.d.ts +78 -2
  37. package/dist/types/src/context.d.ts.map +1 -1
  38. package/dist/types/src/dbg.d.ts +23 -0
  39. package/dist/types/src/dbg.d.ts.map +1 -0
  40. package/dist/types/src/decorators.d.ts.map +1 -1
  41. package/dist/types/src/environment.d.ts +24 -0
  42. package/dist/types/src/environment.d.ts.map +1 -0
  43. package/dist/types/src/environment.test.d.ts +2 -0
  44. package/dist/types/src/environment.test.d.ts.map +1 -0
  45. package/dist/types/src/experimental/ownership.d.ts.map +1 -1
  46. package/dist/types/src/index.d.ts +7 -3
  47. package/dist/types/src/index.d.ts.map +1 -1
  48. package/dist/types/src/jsonl.d.ts +53 -0
  49. package/dist/types/src/jsonl.d.ts.map +1 -0
  50. package/dist/types/src/jsonl.test.d.ts +2 -0
  51. package/dist/types/src/jsonl.test.d.ts.map +1 -0
  52. package/dist/types/src/log-buffer.d.ts +20 -0
  53. package/dist/types/src/log-buffer.d.ts.map +1 -0
  54. package/dist/types/src/log-buffer.test.d.ts +2 -0
  55. package/dist/types/src/log-buffer.test.d.ts.map +1 -0
  56. package/dist/types/src/log.d.ts +44 -1
  57. package/dist/types/src/log.d.ts.map +1 -1
  58. package/dist/types/src/meta.d.ts +20 -1
  59. package/dist/types/src/meta.d.ts.map +1 -1
  60. package/dist/types/src/options.d.ts.map +1 -1
  61. package/dist/types/src/platform/browser/index.d.ts.map +1 -1
  62. package/dist/types/src/platform/index.d.ts +1 -1
  63. package/dist/types/src/platform/index.d.ts.map +1 -1
  64. package/dist/types/src/platform/node/index.d.ts.map +1 -1
  65. package/dist/types/src/processors/browser-processor.d.ts.map +1 -1
  66. package/dist/types/src/processors/common.d.ts.map +1 -1
  67. package/dist/types/src/processors/console-processor.d.ts.map +1 -1
  68. package/dist/types/src/processors/file-processor.d.ts.map +1 -1
  69. package/dist/types/src/processors/index.d.ts +2 -3
  70. package/dist/types/src/processors/index.d.ts.map +1 -1
  71. package/dist/types/src/scope.d.ts.map +1 -1
  72. package/dist/types/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +43 -17
  74. package/src/context.ts +242 -2
  75. package/src/dbg.ts +34 -0
  76. package/src/decorators.ts +1 -2
  77. package/src/environment.test.ts +222 -0
  78. package/src/environment.ts +129 -0
  79. package/src/experimental/classes.test.ts +0 -1
  80. package/src/index.ts +7 -4
  81. package/src/jsonl.test.ts +121 -0
  82. package/src/jsonl.ts +104 -0
  83. package/src/log-buffer.test.ts +158 -0
  84. package/src/log-buffer.ts +89 -0
  85. package/src/log.test.ts +0 -1
  86. package/src/log.ts +56 -12
  87. package/src/meta.ts +29 -1
  88. package/src/options.ts +3 -1
  89. package/src/platform/index.ts +1 -1
  90. package/src/platform/node/index.ts +1 -2
  91. package/src/processors/browser-processor.ts +27 -28
  92. package/src/processors/console-processor.ts +5 -13
  93. package/src/processors/file-processor.ts +7 -9
  94. package/src/processors/index.ts +2 -3
@@ -1,121 +1,157 @@
1
- // src/index.ts
2
- import omit from "lodash.omit";
3
- import { pick } from "@dxos/util";
1
+ import {
2
+ LogEntry,
3
+ LogLevel,
4
+ LogProcessorType,
5
+ gatherLogInfoFromScope,
6
+ getContextFromEntry,
7
+ getRelativeFilename,
8
+ levels,
9
+ logInfo,
10
+ shortLevelName,
11
+ shouldLog
12
+ } from "./chunk-V7FYKT4H.mjs";
13
+ import {
14
+ __export,
15
+ __reExport
16
+ } from "./chunk-IEP6GGEX.mjs";
4
17
 
5
- // src/config.ts
6
- var LogLevel = /* @__PURE__ */ (function(LogLevel2) {
7
- LogLevel2[LogLevel2["TRACE"] = 5] = "TRACE";
8
- LogLevel2[LogLevel2["DEBUG"] = 10] = "DEBUG";
9
- LogLevel2[LogLevel2["VERBOSE"] = 11] = "VERBOSE";
10
- LogLevel2[LogLevel2["INFO"] = 12] = "INFO";
11
- LogLevel2[LogLevel2["WARN"] = 13] = "WARN";
12
- LogLevel2[LogLevel2["ERROR"] = 14] = "ERROR";
13
- return LogLevel2;
14
- })({});
15
- var levels = {
16
- "*": 5,
17
- trace: 5,
18
- debug: 10,
19
- verbose: 11,
20
- info: 12,
21
- warn: 13,
22
- error: 14
23
- };
24
- var shortLevelName = {
25
- [5]: "T",
26
- [10]: "D",
27
- [11]: "V",
28
- [12]: "I",
29
- [13]: "W",
30
- [14]: "E"
31
- };
32
- var LogProcessorType = /* @__PURE__ */ (function(LogProcessorType2) {
33
- LogProcessorType2["CONSOLE"] = "console";
34
- LogProcessorType2["BROWSER"] = "browser";
35
- LogProcessorType2["DEBUG"] = "debug";
36
- return LogProcessorType2;
37
- })({});
18
+ // src/index.ts
19
+ var index_exports = {};
20
+ __export(index_exports, {
21
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
22
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
23
+ LOG_META_MARKER: () => LOG_META_MARKER,
24
+ LogBuffer: () => LogBuffer,
25
+ LogEntry: () => LogEntry,
26
+ LogLevel: () => LogLevel,
27
+ LogProcessorType: () => LogProcessorType,
28
+ createLog: () => createLog,
29
+ dbg: () => dbg,
30
+ debug: () => debug,
31
+ gatherLogInfoFromScope: () => gatherLogInfoFromScope,
32
+ getContextFromEntry: () => getContextFromEntry,
33
+ getCurrentOwnershipScope: () => getCurrentOwnershipScope,
34
+ getRelativeFilename: () => getRelativeFilename,
35
+ inferEnvironmentName: () => inferEnvironmentName,
36
+ isLogMeta: () => isLogMeta,
37
+ levels: () => levels,
38
+ log: () => log,
39
+ logInfo: () => logInfo,
40
+ omit: () => omit,
41
+ parseFilter: () => parseFilter,
42
+ pick: () => pick,
43
+ serializeToJsonl: () => serializeToJsonl,
44
+ shortLevelName: () => shortLevelName,
45
+ shouldLog: () => shouldLog
46
+ });
47
+ import { omit, pick } from "@dxos/util";
38
48
 
39
- // src/scope.ts
40
- var logInfoProperties = Symbol("logInfoProperties");
41
- var logInfo = (target, propertyKey, descriptor) => {
42
- (target[logInfoProperties] ??= []).push(propertyKey);
43
- };
44
- var gatherLogInfoFromScope = (scope) => {
45
- if (!scope) {
46
- return {};
47
- }
48
- const res = {};
49
- const prototype = Object.getPrototypeOf(scope);
50
- const infoProps = (typeof prototype === "object" && prototype !== null ? prototype[logInfoProperties] : []) ?? [];
51
- for (const prop of infoProps) {
52
- try {
53
- res[prop] = typeof scope[prop] === "function" ? scope[prop]() : scope[prop];
54
- } catch (err) {
55
- res[prop] = err.message;
49
+ // src/environment.ts
50
+ var TAB_SUFFIX_STORAGE_KEY = "@dxos/log:env-suffix";
51
+ var SUFFIX_LENGTH = 6;
52
+ var randomSuffix = () => {
53
+ const cryptoRef = globalThis.crypto;
54
+ if (cryptoRef?.getRandomValues) {
55
+ const bytes = new Uint8Array(SUFFIX_LENGTH);
56
+ cryptoRef.getRandomValues(bytes);
57
+ let suffix = "";
58
+ for (const byte of bytes) {
59
+ suffix += (byte % 36).toString(36);
56
60
  }
61
+ return suffix;
57
62
  }
58
- return res;
63
+ return Math.random().toString(36).slice(2, 2 + SUFFIX_LENGTH).padEnd(SUFFIX_LENGTH, "0");
59
64
  };
60
-
61
- // src/context.ts
62
- var matchFilter = (filter, level, path) => {
63
- if (filter.pattern?.startsWith("-")) {
64
- if (path?.includes(filter.pattern.slice(1))) {
65
- if (level >= filter.level) {
66
- return false;
67
- }
68
- }
69
- } else {
70
- if (filter.pattern?.length) {
71
- if (path?.includes(filter.pattern)) {
72
- return level >= filter.level;
73
- }
74
- } else {
75
- if (level >= filter.level) {
76
- return true;
77
- }
65
+ var getOrCreateTabSuffix = (session) => {
66
+ if (!session) {
67
+ return randomSuffix();
68
+ }
69
+ try {
70
+ const existing = session.getItem(TAB_SUFFIX_STORAGE_KEY);
71
+ if (existing && existing.length > 0) {
72
+ return existing;
78
73
  }
74
+ const suffix = randomSuffix();
75
+ session.setItem(TAB_SUFFIX_STORAGE_KEY, suffix);
76
+ return suffix;
77
+ } catch {
78
+ return randomSuffix();
79
79
  }
80
80
  };
81
- var shouldLog = (entry, filters) => {
82
- if (filters === void 0) {
83
- return false;
81
+ var isInstanceOf = (scope, ctorName) => {
82
+ const ctor = scope?.[ctorName];
83
+ return typeof ctor === "function" && scope instanceof ctor;
84
+ };
85
+ var CF_WORKER_USER_AGENT = "Cloudflare-Workers";
86
+ var inferEnvironmentName = (options = {}) => {
87
+ const scope = options.scope ?? globalThis;
88
+ if (scope.navigator?.userAgent === CF_WORKER_USER_AGENT) {
89
+ return `cf-worker::${randomSuffix()}`;
90
+ }
91
+ if (isInstanceOf(scope, "SharedWorkerGlobalScope")) {
92
+ return `shared-worker:${scope.name ?? ""}:${randomSuffix()}`;
93
+ }
94
+ if (isInstanceOf(scope, "ServiceWorkerGlobalScope")) {
95
+ return `service-worker::${randomSuffix()}`;
96
+ }
97
+ if (isInstanceOf(scope, "DedicatedWorkerGlobalScope")) {
98
+ return `dedicated-worker:${scope.name ?? ""}:${randomSuffix()}`;
99
+ }
100
+ if (scope.window !== void 0 && scope.window === scope) {
101
+ const origin = scope.location?.origin ?? "";
102
+ return `tab:${origin}:${getOrCreateTabSuffix(scope.sessionStorage)}`;
103
+ }
104
+ const proc = scope.process;
105
+ if (proc && typeof proc === "object" && proc.versions?.node) {
106
+ const pid = typeof proc.pid === "number" ? String(proc.pid) : "";
107
+ return `node:${pid}:${randomSuffix()}`;
84
108
  }
85
- const results = filters.map((filter) => matchFilter(filter, entry.level, entry.meta?.F)).filter((result) => result !== void 0);
86
- return results.length > 0 && !results.some((results2) => results2 === false);
109
+ return `unknown::${randomSuffix()}`;
87
110
  };
88
- var getContextFromEntry = (entry) => {
89
- let context;
90
- if (entry.meta) {
91
- const scopeInfo = gatherLogInfoFromScope(entry.meta.S);
92
- if (Object.keys(scopeInfo).length > 0) {
93
- context = Object.assign(context ?? {}, scopeInfo);
94
- }
111
+
112
+ // src/jsonl.ts
113
+ var serializeToJsonl = (entry, opts = {}) => {
114
+ if (entry.level <= LogLevel.TRACE) {
115
+ return void 0;
116
+ }
117
+ const { filename, line, context: scopeName } = entry.computedMeta;
118
+ const record = {
119
+ t: new Date(entry.timestamp).toISOString(),
120
+ l: shortLevelName[entry.level] ?? "?",
121
+ m: entry.message ?? ""
122
+ };
123
+ if (filename !== void 0) {
124
+ record.f = filename;
125
+ }
126
+ if (line !== void 0) {
127
+ record.n = line;
128
+ }
129
+ if (scopeName !== void 0) {
130
+ record.o = scopeName;
131
+ }
132
+ if (entry.computedError !== void 0) {
133
+ record.e = entry.computedError;
95
134
  }
96
- const entryContext = typeof entry.context === "function" ? entry.context() : entry.context;
97
- if (entryContext) {
98
- if (entryContext instanceof Error) {
99
- const c = entryContext.context;
100
- context = Object.assign(context ?? {}, {
101
- error: entryContext.stack,
102
- ...c
103
- });
104
- } else if (typeof entryContext === "object") {
105
- context = Object.assign(context ?? {}, entryContext);
135
+ if (opts.env !== void 0) {
136
+ record.i = opts.env;
137
+ }
138
+ const computedContext = entry.computedContext;
139
+ if (Object.keys(computedContext).length > 0) {
140
+ try {
141
+ record.c = JSON.stringify(computedContext);
142
+ } catch {
106
143
  }
107
144
  }
108
- if (entry.error) {
109
- context = Object.assign(context ?? {}, {
110
- error: entry.error
111
- });
145
+ try {
146
+ return JSON.stringify(record);
147
+ } catch {
148
+ return void 0;
112
149
  }
113
- return context && Object.keys(context).length > 0 ? context : void 0;
114
150
  };
115
151
 
116
152
  // src/decorators.ts
117
- import { inspect } from "@dxos/node-std/util";
118
153
  import chalk from "chalk";
154
+ import { inspect } from "@dxos/node-std/util";
119
155
  var nextPromiseId = 0;
120
156
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
121
157
  const method = descriptor.value;
@@ -225,47 +261,21 @@ var formatPromise = (id) => chalk.blue(`Promise#${id}`);
225
261
  // src/options.ts
226
262
  import defaultsDeep from "lodash.defaultsdeep";
227
263
 
228
- // src/platform/browser/index.ts
229
- var loadOptions = (filepath) => {
230
- try {
231
- let dxlog;
232
- if (typeof localStorage === "undefined") {
233
- if (globalThis.localStorage_dxlog) {
234
- dxlog = globalThis.localStorage_dxlog;
235
- }
236
- } else {
237
- dxlog = localStorage.getItem("dxlog") ?? void 0;
238
- }
239
- if (!dxlog) {
240
- return void 0;
241
- }
242
- return JSON.parse(dxlog);
243
- } catch (err) {
244
- console.info("can't parse dxlog config", err);
245
- return void 0;
246
- }
247
- };
264
+ // src/platform/index.ts
265
+ var platform_exports = {};
266
+ __reExport(platform_exports, platform_star);
267
+ import * as platform_star from "#platform";
248
268
 
249
- // src/processors/console-stub.ts
250
- var CONSOLE_PROCESSOR = () => {
251
- };
252
-
253
- // src/processors/debug-processor.ts
254
- import { inspect as inspect2 } from "@dxos/node-std/util";
255
- var DEBUG_PROCESSOR = (config, entry) => {
256
- console.log(inspect2(entry, false, null, true));
257
- };
269
+ // src/processors/index.ts
270
+ var processors_exports = {};
271
+ __export(processors_exports, {
272
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
273
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
274
+ getRelativeFilename: () => getRelativeFilename
275
+ });
258
276
 
259
277
  // src/processors/browser-processor.ts
260
- import { getDebugName, safariCheck } from "@dxos/util";
261
- var getRelativeFilename = (filename) => {
262
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
263
- if (match) {
264
- const [, filePath] = match;
265
- return filePath;
266
- }
267
- return filename;
268
- };
278
+ import { safariCheck } from "@dxos/util";
269
279
  var CONFIG = {
270
280
  useTestProcessor: false,
271
281
  printFileLinks: false
@@ -276,18 +286,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
276
286
  }
277
287
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
278
288
  const LOG_BROWSER_CSS = [];
289
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
279
290
  let link = "";
280
- if (entry.meta) {
281
- const filename = getRelativeFilename(entry.meta.F);
291
+ if (filename !== void 0 && lineNumber !== void 0) {
282
292
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
283
- link = `${filepath}#L${entry.meta.L}`;
293
+ link = `${filepath}#L${lineNumber}`;
284
294
  }
285
295
  let args = [];
286
- if (entry.meta?.S) {
287
- const scope = entry.meta?.S;
288
- const scopeName = scope.name || getDebugName(scope);
289
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
290
- args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
296
+ const scope = entry.meta?.S;
297
+ if (scope) {
298
+ const scopeName = scope.name || scopeDebugName;
299
+ if (scopeName) {
300
+ const processPrefix = scope.hostSessionId ? "[worker] " : "";
301
+ args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
302
+ }
291
303
  }
292
304
  if (entry.message) {
293
305
  args.push(entry.message);
@@ -295,9 +307,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
295
307
  const context = getContextFromEntry(entry);
296
308
  if (context) {
297
309
  if (Object.keys(context).length === 1 && "error" in context) {
298
- args.push(context.error);
310
+ args.push(unwrapEffectError(context.error));
299
311
  } else if (Object.keys(context).length === 1 && "err" in context) {
300
- args.push(context.err);
312
+ args.push(unwrapEffectError(context.err));
301
313
  } else {
302
314
  args.push(context);
303
315
  }
@@ -332,10 +344,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
332
344
  if (!shouldLog(entry, config.filters)) {
333
345
  return;
334
346
  }
335
- let path = "";
336
- if (entry.meta) {
337
- path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;
338
- }
347
+ const { filename, line: lineNumber } = entry.computedMeta;
348
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
339
349
  let args = [];
340
350
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
341
351
  args.push(`${processPrefix}${entry.message}`);
@@ -362,97 +372,33 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
362
372
  }
363
373
  };
364
374
  var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;
365
-
366
- // src/processors/file-processor.ts
367
- import { appendFileSync, mkdirSync, openSync } from "@dxos/node-std/fs";
368
- import { dirname } from "@dxos/node-std/path";
369
- import { jsonlogify } from "@dxos/util";
370
-
371
- // src/processors/common.ts
372
- var getRelativeFilename2 = (filename) => {
373
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
374
- if (match) {
375
- const [, filePath] = match;
376
- return filePath;
377
- }
378
- return filename;
375
+ var originalSymbol = /* @__PURE__ */ Symbol.for("effect/OriginalAnnotation");
376
+ var unwrapEffectError = (error) => {
377
+ if (typeof error === "object" && error !== null && originalSymbol in error) {
378
+ return error[originalSymbol];
379
+ }
380
+ return error;
379
381
  };
380
382
 
381
- // src/processors/file-processor.ts
382
- var EAGAIN_MAX_DURATION = 1e3;
383
- var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
384
- let fd;
385
- return (config, entry) => {
386
- if (levels2.length > 0 && !levels2.includes(entry.level)) {
387
- return;
388
- }
389
- if (!shouldLog(entry, filters)) {
390
- return;
391
- }
392
- if (typeof pathOrFd === "number") {
393
- fd = pathOrFd;
394
- } else {
395
- try {
396
- mkdirSync(dirname(pathOrFd));
397
- } catch {
398
- }
399
- fd = openSync(pathOrFd, "a");
400
- }
401
- const record = {
402
- ...entry,
403
- timestamp: Date.now(),
404
- ...entry.meta ? {
405
- meta: {
406
- file: getRelativeFilename2(entry.meta.F),
407
- line: entry.meta.L
408
- }
409
- } : {},
410
- context: jsonlogify(getContextFromEntry(entry))
411
- };
412
- let retryTS = 0;
413
- while (true) {
414
- try {
415
- return appendFileSync(fd, JSON.stringify(record) + "\n");
416
- } catch (err) {
417
- if (err.code !== "EAGAIN") {
418
- throw err;
419
- }
420
- if (retryTS === 0) {
421
- retryTS = performance.now();
422
- } else {
423
- if (performance.now() - retryTS > EAGAIN_MAX_DURATION) {
424
- console.log(`could not write after ${EAGAIN_MAX_DURATION}ms of EAGAIN failures, giving up`);
425
- throw err;
426
- }
427
- }
428
- }
429
- }
430
- };
431
- };
432
- var logFilePath;
433
- var getLogFilePath = () => {
434
- logFilePath ??= process.env.LOG_FILE ?? (process.env.HOME ? `${process.env.HOME}/.dxlog/${(/* @__PURE__ */ new Date()).toISOString()}.log` : void 0);
435
- return logFilePath;
383
+ // src/processors/index.ts
384
+ __reExport(processors_exports, console_processor_star);
385
+ import * as console_processor_star from "#console-processor";
386
+
387
+ // src/processors/debug-processor.ts
388
+ import { inspect as inspect2 } from "@dxos/node-std/util";
389
+ var DEBUG_PROCESSOR = (config, entry) => {
390
+ console.log(inspect2(entry, false, null, true));
436
391
  };
437
- var FILE_PROCESSOR = createFileProcessor({
438
- pathOrFd: getLogFilePath(),
439
- levels: [
440
- LogLevel.ERROR,
441
- LogLevel.WARN,
442
- LogLevel.INFO,
443
- LogLevel.TRACE
444
- ]
445
- });
446
392
 
447
393
  // src/options.ts
448
394
  var processors = {
449
- [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,
395
+ [LogProcessorType.CONSOLE]: processors_exports.CONSOLE_PROCESSOR,
450
396
  [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,
451
397
  [LogProcessorType.DEBUG]: DEBUG_PROCESSOR
452
398
  };
453
- var browser = typeof window !== "undefined" || typeof navigator !== "undefined";
399
+ var browser = (typeof window !== "undefined" || typeof navigator !== "undefined") && !(typeof process !== "undefined" && process?.env?.VITEST);
454
400
  var DEFAULT_PROCESSORS = [
455
- browser ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR
401
+ browser ? BROWSER_PROCESSOR : processors_exports.CONSOLE_PROCESSOR
456
402
  ];
457
403
  var parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
458
404
  var parseFilter = (filter) => {
@@ -480,7 +426,7 @@ var createConfig = (options) => {
480
426
  filter: process.env.LOG_FILTER,
481
427
  processor: process.env.LOG_PROCESSOR
482
428
  } : void 0;
483
- const mergedOptions = defaultsDeep({}, loadOptions(envOptions?.file), envOptions, options);
429
+ const mergedOptions = defaultsDeep({}, (0, platform_exports.loadOptions)(envOptions?.file), envOptions, options);
484
430
  return {
485
431
  options: mergedOptions,
486
432
  filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),
@@ -506,13 +452,14 @@ var createLog = () => {
506
452
  get: () => log2._config
507
453
  });
508
454
  const processLog = (level, message, context = {}, meta, error) => {
509
- log2._config.processors.forEach((processor) => processor(log2._config, {
455
+ const entry = new LogEntry({
510
456
  level,
511
457
  message,
512
458
  context,
513
459
  meta,
514
460
  error
515
- }));
461
+ });
462
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
516
463
  };
517
464
  Object.assign(log2, {
518
465
  /**
@@ -520,7 +467,7 @@ var createLog = () => {
520
467
  * NOTE: Preserves any processors that were already added to this logger instance
521
468
  * unless an explicit processor option is provided.
522
469
  */
523
- config: ({ processor, ...options }) => {
470
+ config: ({ processor, ...options } = {}) => {
524
471
  const config = createConfig(options);
525
472
  const processors2 = processor ? config.processors : log2._config.processors;
526
473
  log2._config = {
@@ -574,11 +521,94 @@ var debug = (label, args) => {
574
521
  };
575
522
  var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("\n");
576
523
 
524
+ // src/index.ts
525
+ __reExport(index_exports, processors_exports);
526
+
527
+ // src/meta.ts
528
+ var LOG_META_MARKER = "~LogMeta";
529
+ var isLogMeta = (value) => {
530
+ return value != null && typeof value === "object" && value[LOG_META_MARKER] === LOG_META_MARKER;
531
+ };
532
+
533
+ // src/dbg.ts
534
+ var dbg = (arg, meta) => {
535
+ if (meta?.A) {
536
+ console.log(`${meta.A[0]} =`, arg);
537
+ } else {
538
+ console.log(arg);
539
+ }
540
+ return arg;
541
+ };
542
+
543
+ // src/log-buffer.ts
544
+ import { CircularBuffer } from "@dxos/util";
545
+ var DEFAULT_BUFFER_SIZE = 2e3;
546
+ var MAX_CONTEXT_LENGTH = 500;
547
+ var LogBuffer = class {
548
+ _buffer;
549
+ constructor(size = DEFAULT_BUFFER_SIZE) {
550
+ this._buffer = new CircularBuffer(size);
551
+ }
552
+ /**
553
+ * Log processor that can be registered with `log.runtimeConfig.processors`.
554
+ * Captures every level except TRACE (does not apply `shouldLog` / filter; use for full debug dumps).
555
+ */
556
+ logProcessor = (_config, entry) => {
557
+ if (entry.level <= LogLevel.TRACE) {
558
+ return;
559
+ }
560
+ const { filename, line, context: scopeName } = entry.computedMeta;
561
+ const record = {
562
+ t: new Date(entry.timestamp).toISOString(),
563
+ l: shortLevelName[entry.level] ?? "?",
564
+ m: entry.message ?? ""
565
+ };
566
+ if (filename !== void 0) {
567
+ record.f = filename;
568
+ }
569
+ if (line !== void 0) {
570
+ record.n = line;
571
+ }
572
+ if (scopeName !== void 0) {
573
+ record.o = scopeName;
574
+ }
575
+ if (entry.computedError !== void 0) {
576
+ record.e = entry.computedError;
577
+ }
578
+ const computedContext = entry.computedContext;
579
+ if (Object.keys(computedContext).length > 0) {
580
+ try {
581
+ let json = JSON.stringify(computedContext);
582
+ if (json.length > MAX_CONTEXT_LENGTH) {
583
+ json = json.slice(0, MAX_CONTEXT_LENGTH);
584
+ }
585
+ record.c = json;
586
+ } catch {
587
+ }
588
+ }
589
+ this._buffer.push(record);
590
+ };
591
+ /** Number of entries currently in the buffer. */
592
+ get size() {
593
+ return this._buffer.elementCount;
594
+ }
595
+ /** Discard all buffered entries. */
596
+ clear() {
597
+ this._buffer.clear();
598
+ }
599
+ /** Serialize buffer contents as NDJSON (newline-delimited JSON). */
600
+ serialize() {
601
+ const lines = [];
602
+ for (const record of this._buffer) {
603
+ lines.push(JSON.stringify(record));
604
+ }
605
+ return lines.join("\n");
606
+ }
607
+ };
608
+
577
609
  // src/experimental/ownership.ts
578
610
  import { inspect as inspect3 } from "@dxos/node-std/util";
579
- var kOwnershipScope = Symbol("kOwnershipScope");
580
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
581
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
611
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
582
612
  var OwnershipScope = class {
583
613
  constr;
584
614
  parent;
@@ -609,24 +639,28 @@ var OwnershipScope = class {
609
639
  var getCurrentOwnershipScope = (thisRef) => thisRef;
610
640
  export {
611
641
  BROWSER_PROCESSOR,
612
- CONSOLE_PROCESSOR,
613
642
  DEBUG_PROCESSOR,
614
- FILE_PROCESSOR,
643
+ LOG_META_MARKER,
644
+ LogBuffer,
645
+ LogEntry,
615
646
  LogLevel,
616
647
  LogProcessorType,
617
- createFileProcessor,
618
648
  createLog,
649
+ dbg,
619
650
  debug,
620
651
  gatherLogInfoFromScope,
621
652
  getContextFromEntry,
622
653
  getCurrentOwnershipScope,
623
- getRelativeFilename2 as getRelativeFilename,
654
+ getRelativeFilename,
655
+ inferEnvironmentName,
656
+ isLogMeta,
624
657
  levels,
625
658
  log,
626
659
  logInfo,
627
660
  omit,
628
661
  parseFilter,
629
662
  pick,
663
+ serializeToJsonl,
630
664
  shortLevelName,
631
665
  shouldLog
632
666
  };