@dxos/log 0.4.10-main.181e72f → 0.4.10-main.1a9d28b

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.
@@ -87,7 +87,7 @@ var getContextFromEntry = (entry) => {
87
87
  if (entry.error) {
88
88
  const errorContext = entry.error.context;
89
89
  context = Object.assign(context ?? {}, {
90
- error: entry.error,
90
+ error: entry.error.stack,
91
91
  ...errorContext
92
92
  });
93
93
  }
@@ -95,12 +95,10 @@ var getContextFromEntry = (entry) => {
95
95
  };
96
96
 
97
97
  // packages/common/log/src/decorators.ts
98
- import chalk from "chalk";
99
98
  import { inspect } from "@dxos/node-std/util";
100
99
  var nextPromiseId = 0;
101
100
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
102
101
  const method = descriptor.value;
103
- const methodName = propertyKey;
104
102
  descriptor.value = function(...args) {
105
103
  const combinedMeta = {
106
104
  ...meta ?? {},
@@ -112,54 +110,30 @@ var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, property
112
110
  const result = method.apply(this, args);
113
111
  if (isThenable(result)) {
114
112
  const id = nextPromiseId++;
115
- logAsyncBegin(log2, methodName, formattedArgs, id, combinedMeta);
113
+ log2.info(`${propertyKey}(${formattedArgs}) => Promise { #${id} }`, {}, combinedMeta);
116
114
  result.then((resolvedValue) => {
117
- logAsyncResolved(log2, methodName, resolvedValue, id, startTime, combinedMeta);
115
+ if (resolvedValue !== void 0) {
116
+ log2.info(`\u2705 resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms => ${inspect(resolvedValue, false, 1, true)}`, {}, combinedMeta);
117
+ } else {
118
+ log2.info(`\u2705 resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms`, {}, combinedMeta);
119
+ }
118
120
  }, (err) => {
119
- logAsyncRejected(log2, methodName, err, id, startTime, combinedMeta);
121
+ log2.info(`\u{1F525} reject #${id} #${(performance.now() - startTime).toFixed(0)}ms => ${err}`, {}, combinedMeta);
120
122
  });
121
123
  } else {
122
- logSyncCall(log2, methodName, formattedArgs, result, combinedMeta);
124
+ log2.info(`${propertyKey}(${formattedArgs}) => ${inspect(result, false, 1, true)}`, {}, combinedMeta);
123
125
  }
124
126
  return result;
125
127
  } catch (err) {
126
- logSyncError(log2, methodName, formattedArgs, err, combinedMeta);
128
+ log2.error(`${propertyKey}(${formattedArgs}) \u{1F525} ${err}`, {}, combinedMeta);
127
129
  throw err;
128
130
  }
129
131
  };
130
132
  Object.defineProperty(descriptor.value, "name", {
131
- value: methodName + "$log"
133
+ value: propertyKey + "$log"
132
134
  });
133
135
  };
134
136
  var isThenable = (obj) => obj && typeof obj.then === "function";
135
- var logSyncCall = (log2, methodName, formattedArgs, result, combinedMeta) => {
136
- log2.info(`.${formatFunction(methodName)} (${formattedArgs}) ${chalk.gray("resolve")} ${inspect(result, false, 1, true)}`, {}, combinedMeta);
137
- };
138
- var logSyncError = (log2, methodName, formattedArgs, err, combinedMeta) => {
139
- log2.error(`.${formatFunction(methodName)} (${formattedArgs}) \u{1F525} ${err}`, {}, combinedMeta);
140
- };
141
- var logAsyncBegin = (log2, methodName, formattedArgs, promiseId, combinedMeta) => {
142
- log2.info(`.${formatFunction(methodName)} \u21B4 (${formattedArgs}) ${chalk.gray("=>")} ${formatPromise(promiseId)}`, {}, combinedMeta);
143
- };
144
- var logAsyncResolved = (log2, methodName, resolvedValue, promiseId, startTime, combinedMeta) => {
145
- if (resolvedValue !== void 0) {
146
- log2.info(`.${formatFunction(methodName)} \u21B2 ${greenCheck} ${chalk.gray("resolve")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray("=>")} ${inspect(resolvedValue, false, 1, true)}`, {}, combinedMeta);
147
- } else {
148
- log2.info(`.${formatFunction(methodName)} \u21B2 ${greenCheck} ${chalk.gray("resolve")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)}`, {}, combinedMeta);
149
- }
150
- };
151
- var logAsyncRejected = (log2, methodName, err, promiseId, startTime, combinedMeta) => {
152
- log2.info(`.${formatFunction(methodName)} \u21B2 \u{1F525} ${chalk.gray("reject")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray("=>")} ${err}`, {}, combinedMeta);
153
- };
154
- var greenCheck = chalk.green("\u2714");
155
- var formatTimeElapsed = (startTime) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
156
- var COLOR_FUNCTION = [
157
- 220,
158
- 220,
159
- 170
160
- ];
161
- var formatFunction = (name) => chalk.bold(chalk.rgb(...COLOR_FUNCTION)(name));
162
- var formatPromise = (id) => chalk.blue(`Promise#${id}`);
163
137
 
164
138
  // packages/common/log/src/options.ts
165
139
  import defaultsDeep from "lodash.defaultsdeep";
@@ -301,7 +275,6 @@ var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_B
301
275
  import { appendFileSync, mkdirSync, openSync } from "@dxos/node-std/fs";
302
276
  import { dirname } from "@dxos/node-std/path";
303
277
  import { jsonify } from "@dxos/util";
304
- var EAGAIN_MAX_DURATION = 1e3;
305
278
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
306
279
  let fd;
307
280
  return (config, entry) => {
@@ -329,24 +302,7 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
329
302
  },
330
303
  context: jsonify(getContextFromEntry(entry))
331
304
  };
332
- let retryTS = 0;
333
- while (true) {
334
- try {
335
- return appendFileSync(fd, JSON.stringify(record) + "\n");
336
- } catch (err) {
337
- if (err.code !== "EAGAIN") {
338
- throw err;
339
- }
340
- if (retryTS === 0) {
341
- retryTS = performance.now();
342
- } else {
343
- if (performance.now() - retryTS > EAGAIN_MAX_DURATION) {
344
- console.log(`could not write after ${EAGAIN_MAX_DURATION}ms of EAGAIN failures, giving up`);
345
- throw err;
346
- }
347
- }
348
- }
349
- }
305
+ appendFileSync(fd, JSON.stringify(record) + "\n");
350
306
  };
351
307
  };
352
308
  var logFilePath;
@@ -435,7 +391,7 @@ var createLog = () => {
435
391
  log2.info = (...params) => processLog(LogLevel.INFO, ...params);
436
392
  log2.warn = (...params) => processLog(LogLevel.WARN, ...params);
437
393
  log2.error = (...params) => processLog(LogLevel.ERROR, ...params);
438
- log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, error.message, context, meta, error);
394
+ log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, error.stack, context, meta, error);
439
395
  log2.break = () => log2.info("\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014");
440
396
  log2.stack = (message, context, meta) => processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
441
397
  ${getFormattedStackTrace()}`, context, meta);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts", "../../../src/config.ts", "../../../src/scope.ts", "../../../src/context.ts", "../../../src/decorators.ts", "../../../src/options.ts", "../../../src/platform/browser/index.ts", "../../../src/processors/console-stub.ts", "../../../src/processors/debug-processor.ts", "../../../src/processors/browser-processor.ts", "../../../src/processors/file-processor.ts", "../../../src/log.ts", "../../../src/experimental/ownership.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\n// Message helpers.\nimport omit from 'lodash.omit';\nimport pick from 'lodash.pick';\n\nexport { omit, pick };\n\nexport * from './config';\nexport * from './context';\nexport * from './log';\nexport { parseFilter } from './options';\nexport * from './processors';\nexport * from './scope';\nexport * from './meta';\n\nexport { getCurrentOwnershipScope } from './experimental/ownership';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogProcessor } from './context';\n\n/**\n * Standard levels.\n */\n// NOTE: Keep aligned with LogLevel in @dxos/protocols.\n// TODO(burdon): Update numbers?\nexport enum LogLevel {\n TRACE = 5,\n DEBUG = 10,\n INFO = 11,\n WARN = 12,\n ERROR = 13,\n}\n\nexport const levels: { [index: string]: LogLevel } = {\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n};\n\nexport const shortLevelName = {\n [LogLevel.TRACE]: 'T',\n [LogLevel.DEBUG]: 'D',\n [LogLevel.INFO]: 'I',\n [LogLevel.WARN]: 'W',\n [LogLevel.ERROR]: 'E',\n};\n\nexport enum LogProcessorType {\n CONSOLE = 'console',\n BROWSER = 'browser',\n DEBUG = 'debug',\n}\n\n/**\n * Individual filter condition.\n */\nexport type LogFilter = {\n level: LogLevel;\n pattern?: string;\n};\n\n/**\n * Options to set inline or load from the YML file.\n */\nexport type LogOptions = {\n file?: string;\n filter?: string | string[] | LogLevel;\n captureFilter?: string | string[] | LogLevel;\n depth?: number; // Context object depth.\n processor?: string | LogProcessorType;\n formatter?: {\n column: number;\n timestamp: boolean;\n timestampFirst: boolean;\n };\n prefix?: string;\n};\n\n/**\n * Runtime config.\n */\nexport interface LogConfig {\n options: LogOptions;\n filters?: LogFilter[];\n captureFilters?: LogFilter[];\n processors: LogProcessor[];\n prefix?: string;\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nconst logInfoProperties = Symbol('logInfoProperties');\n\n/**\n * Decorate fields, properties, or methods to automatically include their values in log messages.\n *\n * Example:\n *\n * ```typescript\n * class Example {\n * @logInfo\n * peerId: PublicKey;\n * }\n * ```\n */\nexport const logInfo = (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[logInfoProperties] ??= []).push(propertyKey);\n};\n\n/**\n * Introspects class instance to find decorated metadata.\n * @param scope Class instance.\n */\nexport const gatherLogInfoFromScope = (scope: any): Record<string, any> => {\n if (!scope) {\n return {};\n }\n\n const res: Record<string, any> = {};\n\n const prototype = Object.getPrototypeOf(scope);\n const infoProps = prototype[logInfoProperties] ?? [];\n for (const prop of infoProps) {\n try {\n res[prop] = typeof scope[prop] === 'function' ? scope[prop]() : scope[prop];\n } catch (err: any) {\n res[prop] = err.message;\n }\n }\n\n return res;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, type LogFilter, type LogLevel } from './config';\nimport { type CallMetadata } from './meta';\nimport { gatherLogInfoFromScope } from './scope';\n\n/**\n * Optional object passed to the logging API.\n */\nexport type LogContext = Record<string, any> | Error | any;\n\n/**\n * Record for current log line.\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: LogContext;\n meta?: CallMetadata;\n error?: Error;\n}\n\n/**\n * Processes (e.g., prints, forwards) log entries.\n */\nexport type LogProcessor = (config: LogConfig, entry: LogEntry) => void;\n\nconst matchFilter = (filter: LogFilter, level: LogLevel, path: string) => {\n return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));\n};\n\n/**\n * Determines if the current line should be logged (called by the processor).\n */\nexport const shouldLog = (entry: LogEntry, filters?: LogFilter[]): boolean => {\n if (filters === undefined) {\n return true;\n } else {\n return filters.some((filter) => matchFilter(filter, entry.level, entry.meta?.F ?? ''));\n }\n};\n\nexport const getContextFromEntry = (entry: LogEntry): Record<string, any> | undefined => {\n let context;\n if (entry.meta) {\n const scopeInfo = gatherLogInfoFromScope(entry.meta.S);\n if (Object.keys(scopeInfo).length > 0) {\n context = Object.assign(context ?? {}, scopeInfo);\n }\n }\n\n if (entry.context) {\n if (entry.context instanceof Error) {\n // Additional context from Error.\n const c = (entry.context as any).context;\n // If ERROR then show stacktrace.\n context = Object.assign(context ?? {}, { error: entry.context.stack, ...c });\n } else if (typeof entry.context === 'object') {\n context = Object.assign(context ?? {}, entry.context);\n }\n }\n\n if (entry.error) {\n const errorContext = (entry.error as any).context;\n context = Object.assign(context ?? {}, { error: entry.error, ...errorContext });\n }\n\n return context && Object.keys(context).length > 0 ? context : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport chalk from 'chalk';\nimport { inspect } from 'node:util';\n\nimport type { LogMethods } from './log';\nimport { type CallMetadata } from './meta';\n\nlet nextPromiseId = 0;\n\nexport const createMethodLogDecorator =\n (log: LogMethods) =>\n (arg0?: never, arg1?: never, meta?: CallMetadata): MethodDecorator =>\n (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const method = descriptor.value!;\n const methodName = propertyKey as string;\n descriptor.value = function (this: any, ...args: any) {\n const combinedMeta = {\n ...(meta ?? {}),\n S: this as any,\n } as CallMetadata;\n\n const formattedArgs = args.map((arg: any) => inspect(arg, false, 1, true)).join(', ');\n\n try {\n const startTime = performance.now();\n const result = method.apply(this, args);\n\n if (isThenable(result)) {\n const id = nextPromiseId++;\n logAsyncBegin(log, methodName, formattedArgs, id, combinedMeta);\n result.then(\n (resolvedValue) => {\n logAsyncResolved(log, methodName, resolvedValue, id, startTime, combinedMeta);\n },\n (err) => {\n logAsyncRejected(log, methodName, err, id, startTime, combinedMeta);\n },\n );\n } else {\n logSyncCall(log, methodName, formattedArgs, result, combinedMeta);\n }\n\n return result;\n } catch (err: any) {\n logSyncError(log, methodName, formattedArgs, err, combinedMeta);\n throw err;\n }\n };\n Object.defineProperty(descriptor.value, 'name', { value: methodName + '$log' });\n };\n\nconst isThenable = (obj: any): obj is Promise<unknown> => obj && typeof obj.then === 'function';\n\nconst logSyncCall = (\n log: LogMethods,\n methodName: string,\n formattedArgs: string,\n result: unknown,\n combinedMeta: CallMetadata,\n) => {\n log.info(\n `.${formatFunction(methodName)} (${formattedArgs}) ${chalk.gray('resolve')} ${inspect(result, false, 1, true)}`,\n {},\n combinedMeta,\n );\n};\n\nconst logSyncError = (\n log: LogMethods,\n methodName: string,\n formattedArgs: string,\n err: Error,\n combinedMeta: CallMetadata,\n) => {\n log.error(`.${formatFunction(methodName)} (${formattedArgs}) 🔥 ${err}`, {}, combinedMeta);\n};\n\nconst logAsyncBegin = (\n log: LogMethods,\n methodName: string,\n formattedArgs: string,\n promiseId: number,\n combinedMeta: CallMetadata,\n) => {\n log.info(\n `.${formatFunction(methodName)} ↴ (${formattedArgs}) ${chalk.gray('=>')} ${formatPromise(promiseId)}`,\n {},\n combinedMeta,\n );\n};\n\nconst logAsyncResolved = (\n log: LogMethods,\n methodName: string,\n resolvedValue: unknown | undefined,\n promiseId: number,\n startTime: number,\n combinedMeta: CallMetadata,\n) => {\n if (resolvedValue !== undefined) {\n log.info(\n `.${formatFunction(methodName)} ↲ ${greenCheck} ${chalk.gray('resolve')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray('=>')} ${inspect(\n resolvedValue,\n false,\n 1,\n true,\n )}`,\n {},\n combinedMeta,\n );\n } else {\n log.info(\n `.${formatFunction(methodName)} ↲ ${greenCheck} ${chalk.gray('resolve')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)}`,\n {},\n combinedMeta,\n );\n }\n};\n\nconst logAsyncRejected = (\n log: LogMethods,\n methodName: string,\n err: Error,\n promiseId: number,\n startTime: number,\n combinedMeta: CallMetadata,\n) => {\n log.info(\n `.${formatFunction(methodName)} ↲ 🔥 ${chalk.gray('reject')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray('=>')} ${err}`,\n {},\n combinedMeta,\n );\n};\n\nconst greenCheck = chalk.green('✔');\n\nconst formatTimeElapsed = (startTime: number) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);\n\nconst COLOR_FUNCTION = [220, 220, 170] as const;\n\nconst formatFunction = (name: string) => chalk.bold(chalk.rgb(...COLOR_FUNCTION)(name));\n\nconst formatPromise = (id: number) => chalk.blue(`Promise#${id}`);\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { type LogConfig, type LogFilter, LogLevel, type LogOptions, LogProcessorType, levels } from './config';\nimport { type LogProcessor } from './context';\nimport { loadOptions } from './platform';\nimport { CONSOLE_PROCESSOR, DEBUG_PROCESSOR, BROWSER_PROCESSOR } from './processors';\n\n/**\n * Processor variants.\n */\nexport const processors: { [index: string]: LogProcessor } = {\n [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,\n [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,\n [LogProcessorType.DEBUG]: DEBUG_PROCESSOR,\n};\n\nconst IS_BROWSER = typeof window !== 'undefined' || typeof navigator !== 'undefined';\n\nexport const DEFAULT_PROCESSORS = [IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR];\n\nexport const parseFilter = (filter: string | string[] | LogLevel): LogFilter[] => {\n if (typeof filter === 'number') {\n return [{ level: filter }];\n }\n\n const parseLogLevel = (level: string, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;\n\n const lines = typeof filter === 'string' ? filter.split(/,\\s*/) : filter;\n return lines.map((filter) => {\n const [pattern, level] = filter.split(':');\n return level ? { level: parseLogLevel(level), pattern } : { level: parseLogLevel(pattern) };\n });\n};\n\nexport const getConfig = (options?: LogOptions): LogConfig => {\n const nodeOptions: LogOptions | undefined =\n 'process' in globalThis\n ? {\n file: process!.env.LOG_CONFIG,\n filter: process!.env.LOG_FILTER,\n processor: process!.env.LOG_PROCESSOR,\n }\n : undefined;\n\n const mergedOptions: LogOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);\n return {\n options: mergedOptions,\n filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),\n captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),\n processors: mergedOptions.processor ? [processors[mergedOptions.processor]] : DEFAULT_PROCESSORS,\n prefix: mergedOptions.prefix,\n };\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogOptions } from '../../config';\n\n// NOTE: Implementation for the browser. See `package.json`.\nexport const loadOptions = (filepath?: string): LogOptions | undefined => {\n let dxlog: string | undefined;\n // if running in a worker, use the localStorage.dxlog setting forwarded on worker initilization in\n // @dxos/client/src/worker/onconnect.ts\n if (typeof localStorage === 'undefined') {\n if ((globalThis as any).localStorage_dxlog) {\n dxlog = (globalThis as any).localStorage_dxlog;\n }\n } else {\n dxlog = localStorage.getItem('dxlog') ?? undefined;\n }\n if (!dxlog) {\n return undefined;\n }\n try {\n return JSON.parse(dxlog);\n } catch (err) {\n console.info(\"can't parse dxlog config\", err);\n return undefined;\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// TODO(wittjosiah): Consider mapping console processor directly to browser processor in the browser.\nexport const CONSOLE_PROCESSOR = () => {};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport { type LogProcessor } from '../context';\n\nexport const DEBUG_PROCESSOR: LogProcessor = (config, entry) => {\n console.log(inspect(entry, false, null, true));\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { getDebugName, safariCheck } from '@dxos/util';\n\nimport { LogLevel } from '../config';\nimport { getContextFromEntry, type LogProcessor, shouldLog } from '../context';\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n\ntype Config = {\n useTestProcessor: boolean;\n printFileLinks: boolean;\n};\n\nconst CONFIG: Config =\n typeof mochaExecutor !== 'undefined'\n ? {\n useTestProcessor: true,\n printFileLinks: true,\n }\n : {\n useTestProcessor: false,\n printFileLinks: false,\n };\n\n/**\n * For running apps in the browser normally.\n */\nconst APP_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n // Example local editor prefix: 'vscode://file/Users/burdon/Code/dxos/dxos/'.\n const LOG_BROWSER_PREFIX = config.prefix ?? 'https://vscode.dev/github.com/dxos/dxos/blob/main/';\n\n // TODO(burdon): CSS breaks formatting (e.g., [Object] rather than expandable property).\n // TODO(burdon): Consider custom formatters.\n // https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html\n // NOTE: Cannot change color of link (from bright white).\n // const LOG_BROWSER_CSS = ['color:gray; font-size:10px; padding-bottom: 4px', 'color:#B97852; font-size:14px;'];\n const LOG_BROWSER_CSS: string[] = [];\n\n let link = '';\n if (entry.meta) {\n const filename = getRelativeFilename(entry.meta.F);\n const filepath = `${LOG_BROWSER_PREFIX.replace(/\\/$/, '')}/${filename}`;\n // TODO(burdon): Line numbers not working for app link, even with colons.\n // https://stackoverflow.com/a/54459820/2804332\n link = `${filepath}#L${entry.meta.L}`;\n }\n\n let args = [];\n\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n const scopeName = scope.name || getDebugName(scope);\n const processPrefix = entry.meta.S?.hostSessionId ? '[worker] ' : '';\n // TODO(dmaretskyi): Those can be made clickable with a custom formatter.\n args.push(`%c${processPrefix}${scopeName}`, 'color:#C026D3;font-weight:bold');\n }\n\n args.push(entry.message);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n // Safari prints source code location as this file, not the caller.\n if (CONFIG.printFileLinks || safariCheck()) {\n if (LOG_BROWSER_CSS?.length) {\n args = [`%c${link}\\n%c${args.join(' ')}`, ...LOG_BROWSER_CSS];\n } else {\n args = [link + '\\n', ...args];\n }\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\n/**\n * For running unit tests in the headless browser.\n */\nconst TEST_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n let path = '';\n if (entry.meta) {\n path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;\n }\n\n let args = [];\n\n const processPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n args.push(`${processPrefix}${entry.message}`);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n if (CONFIG.printFileLinks) {\n args = [path, ...args];\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\nexport const BROWSER_PROCESSOR: LogProcessor = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { appendFileSync, mkdirSync, openSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { jsonify } from '@dxos/util';\n\nimport { type LogFilter, LogLevel } from '../config';\nimport { type LogProcessor, getContextFromEntry, shouldLog } from '../context';\n\n// Amount of time to retry writing after encountering EAGAIN before giving up.\nconst EAGAIN_MAX_DURATION = 1000;\n/**\n * Create a file processor.\n * @param path - Path to log file to create or append to, or existing open file descriptor e.g. stdout.\n * @param levels - Log levels to process. Takes preference over Filters.\n * @param filters - Filters to apply.\n */\nexport const createFileProcessor = ({\n pathOrFd,\n levels,\n filters,\n}: {\n pathOrFd: string | number;\n levels: LogLevel[];\n filters?: LogFilter[];\n}): LogProcessor => {\n let fd: number | undefined;\n\n return (config, entry) => {\n if (levels.length > 0 && !levels.includes(entry.level)) {\n return;\n }\n if (!shouldLog(entry, filters)) {\n return;\n }\n if (typeof pathOrFd === 'number') {\n fd = pathOrFd;\n } else {\n try {\n mkdirSync(dirname(pathOrFd));\n } catch {}\n fd = openSync(pathOrFd, 'w');\n }\n\n const record = {\n ...entry,\n timestamp: Date.now(),\n meta: {\n file: entry.meta?.F,\n line: entry.meta?.L,\n },\n context: jsonify(getContextFromEntry(entry)),\n };\n let retryTS: number = 0;\n\n // Retry writing if EAGAIN is encountered.\n //\n // Node may set stdout and stderr to non-blocking. https://github.com/nodejs/node/issues/42826\n // This can cause EAGAIN errors when writing to them.\n // In order to not drop logs, make log methods asynchronous, or deal with buffering/delayed writes, spin until write succeeds.\n\n while (true) {\n try {\n return appendFileSync(fd, JSON.stringify(record) + '\\n');\n } catch (err: any) {\n if (err.code !== 'EAGAIN') {\n throw err;\n }\n if (retryTS === 0) {\n retryTS = performance.now();\n } else {\n if (performance.now() - retryTS > EAGAIN_MAX_DURATION) {\n console.log(`could not write after ${EAGAIN_MAX_DURATION}ms of EAGAIN failures, giving up`);\n throw err;\n }\n }\n }\n }\n };\n};\n\nlet logFilePath: string | undefined;\nconst getLogFilePath = () => {\n logFilePath ??=\n process.env.LOG_FILE ??\n (process.env.HOME ? `${process.env.HOME}/.dxlog/${new Date().toISOString()}.log` : undefined);\n\n return logFilePath!;\n};\n\nexport const FILE_PROCESSOR: LogProcessor = createFileProcessor({\n pathOrFd: getLogFilePath(),\n levels: [LogLevel.ERROR, LogLevel.WARN, LogLevel.INFO, LogLevel.TRACE],\n});\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, LogLevel, type LogOptions } from './config';\nimport { type LogContext, type LogProcessor } from './context';\nimport { createMethodLogDecorator } from './decorators';\nimport { type CallMetadata } from './meta';\nimport { getConfig, DEFAULT_PROCESSORS } from './options';\n\n/**\n * Logging function.\n */\ntype LogFunction = (message: string, context?: LogContext, meta?: CallMetadata) => void;\n\n/**\n * Logging methods.\n */\nexport interface LogMethods {\n trace: LogFunction;\n debug: LogFunction;\n info: LogFunction;\n warn: LogFunction;\n error: LogFunction;\n catch: (error: Error | any, context?: LogContext, meta?: CallMetadata) => void;\n break: () => void;\n stack: (message?: string, context?: never, meta?: CallMetadata) => void;\n method: (arg0?: never, arg1?: never, meta?: CallMetadata) => MethodDecorator;\n}\n\n/**\n * Properties accessible on the logging function.\n */\ninterface Log extends LogMethods, LogFunction {\n config: (options: LogOptions) => void;\n addProcessor: (processor: LogProcessor) => void;\n runtimeConfig: LogConfig;\n}\n\ninterface LogImp extends Log {\n _config: LogConfig;\n}\n\nconst createLog = (): LogImp => {\n const log: LogImp = ((...params) => processLog(LogLevel.DEBUG, ...params)) as LogImp;\n\n log._config = getConfig();\n Object.defineProperty(log, 'runtimeConfig', { get: () => log._config });\n\n log.addProcessor = (processor: LogProcessor) => {\n if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {\n DEFAULT_PROCESSORS.push(processor);\n }\n if (log._config.processors.filter((p) => p === processor).length === 0) {\n log._config.processors.push(processor);\n }\n };\n\n // Set config.\n log.config = (options: LogOptions) => {\n log._config = getConfig(options);\n };\n\n // TODO(burdon): API to set context and separate error object.\n // E.g., log.warn('failed', { key: 123 }, err);\n\n log.trace = (...params) => processLog(LogLevel.TRACE, ...params);\n log.debug = (...params) => processLog(LogLevel.DEBUG, ...params);\n log.info = (...params) => processLog(LogLevel.INFO, ...params);\n log.warn = (...params) => processLog(LogLevel.WARN, ...params);\n log.error = (...params) => processLog(LogLevel.ERROR, ...params);\n\n // Catch only shows error message, not stacktrace.\n log.catch = (error: Error | any, context, meta) => processLog(LogLevel.ERROR, error.message, context, meta, error);\n\n // Show break.\n log.break = () => log.info('——————————————————————————————————————————————————');\n\n log.stack = (message, context, meta) =>\n processLog(LogLevel.INFO, `${message ?? 'Stack Dump'}\\n${getFormattedStackTrace()}`, context, meta);\n\n log.method = createMethodLogDecorator(log);\n\n /**\n * Process the current log call.\n */\n const processLog = (\n level: LogLevel,\n message: string,\n context: LogContext = {},\n meta?: CallMetadata,\n error?: Error,\n ) => {\n log._config.processors.forEach((processor) => processor(log._config, { level, message, context, meta, error }));\n };\n\n return log;\n};\n\n/**\n * Global logging function.\n */\nexport const log: Log = ((globalThis as any).dx_log ??= createLog());\n\n/**\n * Accessible from browser console.\n */\ndeclare global {\n // eslint-disable-next-line camelcase\n const dx_log: Log;\n}\n\nconst getFormattedStackTrace = () => new Error().stack!.split('\\n').slice(3).join('\\n');\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nconst kOwnershipScope = Symbol('kOwnershipScope');\nconst kCurrentOwnershipScope = Symbol('kCurrentOwnershipScope');\nconst kDebugInfoProperties = Symbol('kDebugInfoProperties');\n\n/**\n *\n */\n// TODO(burdon): Document.\nexport class OwnershipScope {\n public instance: any;\n\n constructor(\n public constr: any,\n public parent?: OwnershipScope,\n ) {}\n\n getInfo() {\n if (!this.instance) {\n return {};\n }\n const props = this.constr.prototype[kDebugInfoProperties] ?? [];\n const info: any = {};\n for (const prop of props) {\n info[prop] = this.instance[prop];\n }\n return info;\n }\n\n [inspect.custom]() {\n return {\n className: this.constr.name,\n info: this.getInfo(),\n parent: this.parent,\n };\n }\n}\n\nfunction decorateMethodWeakReturnOwnership(prototype: any, key: string) {\n const original = prototype[key];\n prototype[key] = function (...args: any) {\n const res = original.apply(this, ...args);\n\n if (res && typeof res.then === 'function') {\n res.then((value: any) => {\n if (kOwnershipScope in value) {\n value[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n });\n } else {\n if (res && kOwnershipScope in res) {\n res[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n }\n\n return res;\n };\n}\n\nexport function ownershipClass<T extends { new (...args: any[]): {} }>(constr: T) {\n for (const key of Object.getOwnPropertyNames(constr.prototype)) {\n if (key !== 'constructor' && typeof constr.prototype[key] === 'function') {\n decorateMethodWeakReturnOwnership(constr.prototype, key);\n }\n }\n\n return class extends constr {\n constructor(...args: any[]) {\n const currentCausality = (globalThis as any)[kCurrentOwnershipScope];\n (globalThis as any)[kCurrentOwnershipScope] = new OwnershipScope(constr, currentCausality);\n super(...args);\n (this as any)[kOwnershipScope] = (globalThis as any)[kCurrentOwnershipScope];\n (this as any)[kOwnershipScope].instance = this;\n (globalThis as any)[kCurrentOwnershipScope] = currentCausality;\n }\n };\n}\n\nexport const debugInfo = (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[kDebugInfoProperties] ??= []).push(propertyKey);\n};\n\nexport const getCurrentOwnershipScope = (thisRef: any) => thisRef;\n"],
5
- "mappings": "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",
6
- "names": ["omit", "pick", "LogLevel", "levels", "trace", "debug", "info", "warn", "error", "shortLevelName", "LogProcessorType", "logInfoProperties", "Symbol", "logInfo", "target", "propertyKey", "descriptor", "push", "gatherLogInfoFromScope", "scope", "res", "prototype", "Object", "getPrototypeOf", "infoProps", "prop", "err", "message", "matchFilter", "filter", "level", "path", "pattern", "includes", "shouldLog", "entry", "filters", "undefined", "some", "meta", "F", "getContextFromEntry", "context", "scopeInfo", "gatherLogInfoFromScope", "S", "Object", "keys", "length", "assign", "Error", "c", "error", "stack", "errorContext", "chalk", "inspect", "nextPromiseId", "createMethodLogDecorator", "log", "arg0", "arg1", "meta", "target", "propertyKey", "descriptor", "method", "value", "methodName", "args", "combinedMeta", "S", "formattedArgs", "map", "arg", "inspect", "join", "startTime", "performance", "now", "result", "apply", "isThenable", "id", "logAsyncBegin", "then", "resolvedValue", "logAsyncResolved", "err", "logAsyncRejected", "logSyncCall", "logSyncError", "Object", "defineProperty", "obj", "info", "formatFunction", "chalk", "gray", "error", "promiseId", "formatPromise", "undefined", "greenCheck", "formatTimeElapsed", "green", "toFixed", "COLOR_FUNCTION", "name", "bold", "rgb", "blue", "defaultsDeep", "loadOptions", "filepath", "dxlog", "localStorage", "globalThis", "localStorage_dxlog", "getItem", "undefined", "JSON", "parse", "err", "console", "info", "CONSOLE_PROCESSOR", "inspect", "DEBUG_PROCESSOR", "config", "entry", "console", "log", "inspect", "getDebugName", "safariCheck", "getRelativeFilename", "filename", "match", "filePath", "CONFIG", "mochaExecutor", "useTestProcessor", "printFileLinks", "APP_BROWSER_PROCESSOR", "config", "entry", "shouldLog", "filters", "LOG_BROWSER_PREFIX", "prefix", "LOG_BROWSER_CSS", "link", "meta", "F", "filepath", "replace", "L", "args", "S", "scope", "scopeName", "name", "getDebugName", "processPrefix", "hostSessionId", "push", "message", "context", "getContextFromEntry", "levels", "LogLevel", "ERROR", "console", "error", "WARN", "warn", "DEBUG", "log", "safariCheck", "length", "join", "level", "C", "TEST_BROWSER_PROCESSOR", "path", "BROWSER_PROCESSOR", "appendFileSync", "mkdirSync", "openSync", "dirname", "jsonify", "EAGAIN_MAX_DURATION", "createFileProcessor", "pathOrFd", "levels", "filters", "fd", "config", "entry", "length", "includes", "level", "shouldLog", "mkdirSync", "dirname", "openSync", "record", "timestamp", "Date", "now", "meta", "file", "F", "line", "L", "context", "jsonify", "getContextFromEntry", "retryTS", "appendFileSync", "JSON", "stringify", "err", "code", "performance", "console", "log", "logFilePath", "getLogFilePath", "process", "env", "LOG_FILE", "HOME", "toISOString", "undefined", "FILE_PROCESSOR", "LogLevel", "ERROR", "WARN", "INFO", "TRACE", "processors", "LogProcessorType", "CONSOLE", "CONSOLE_PROCESSOR", "BROWSER", "BROWSER_PROCESSOR", "DEBUG", "DEBUG_PROCESSOR", "IS_BROWSER", "window", "navigator", "DEFAULT_PROCESSORS", "parseFilter", "filter", "level", "parseLogLevel", "defValue", "LogLevel", "WARN", "levels", "toLowerCase", "lines", "split", "map", "pattern", "getConfig", "options", "nodeOptions", "globalThis", "file", "process", "env", "LOG_CONFIG", "LOG_FILTER", "processor", "LOG_PROCESSOR", "undefined", "mergedOptions", "defaultsDeep", "loadOptions", "filters", "INFO", "captureFilters", "captureFilter", "prefix", "createLog", "log", "params", "processLog", "LogLevel", "DEBUG", "_config", "getConfig", "Object", "defineProperty", "get", "addProcessor", "processor", "DEFAULT_PROCESSORS", "filter", "p", "length", "push", "processors", "config", "options", "trace", "TRACE", "debug", "info", "INFO", "warn", "WARN", "error", "ERROR", "catch", "context", "meta", "message", "break", "stack", "getFormattedStackTrace", "method", "createMethodLogDecorator", "level", "forEach", "globalThis", "dx_log", "Error", "split", "slice", "join", "inspect", "kOwnershipScope", "Symbol", "kCurrentOwnershipScope", "kDebugInfoProperties", "OwnershipScope", "constructor", "constr", "parent", "getInfo", "instance", "props", "prototype", "info", "prop", "inspect", "custom", "className", "name", "getCurrentOwnershipScope", "thisRef"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\n// Message helpers.\nimport omit from 'lodash.omit';\nimport pick from 'lodash.pick';\n\nexport { omit, pick };\n\nexport * from './config';\nexport * from './context';\nexport * from './log';\nexport { parseFilter } from './options';\nexport * from './processors';\nexport * from './scope';\nexport * from './meta';\n\nexport { getCurrentOwnershipScope } from './experimental/ownership';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogProcessor } from './context';\n\n/**\n * Standard levels.\n */\n// NOTE: Keep aligned with LogLevel in @dxos/protocols.\n// TODO(burdon): Update numbers?\nexport enum LogLevel {\n TRACE = 5,\n DEBUG = 10,\n INFO = 11,\n WARN = 12,\n ERROR = 13,\n}\n\nexport const levels: { [index: string]: LogLevel } = {\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n};\n\nexport const shortLevelName = {\n [LogLevel.TRACE]: 'T',\n [LogLevel.DEBUG]: 'D',\n [LogLevel.INFO]: 'I',\n [LogLevel.WARN]: 'W',\n [LogLevel.ERROR]: 'E',\n};\n\nexport enum LogProcessorType {\n CONSOLE = 'console',\n BROWSER = 'browser',\n DEBUG = 'debug',\n}\n\n/**\n * Individual filter condition.\n */\nexport type LogFilter = {\n level: LogLevel;\n pattern?: string;\n};\n\n/**\n * Options to set inline or load from the YML file.\n */\nexport type LogOptions = {\n file?: string;\n filter?: string | string[] | LogLevel;\n captureFilter?: string | string[] | LogLevel;\n depth?: number; // Context object depth.\n processor?: string | LogProcessorType;\n formatter?: {\n column: number;\n timestamp: boolean;\n timestampFirst: boolean;\n };\n prefix?: string;\n};\n\n/**\n * Runtime config.\n */\nexport interface LogConfig {\n options: LogOptions;\n filters?: LogFilter[];\n captureFilters?: LogFilter[];\n processors: LogProcessor[];\n prefix?: string;\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nconst logInfoProperties = Symbol('logInfoProperties');\n\n/**\n * Decorate fields, properties, or methods to automatically include their values in log messages.\n *\n * Example:\n *\n * ```typescript\n * class Example {\n * @logInfo\n * peerId: PublicKey;\n * }\n * ```\n */\nexport const logInfo = (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[logInfoProperties] ??= []).push(propertyKey);\n};\n\n/**\n * Introspects class instance to find decorated metadata.\n * @param scope Class instance.\n */\nexport const gatherLogInfoFromScope = (scope: any): Record<string, any> => {\n if (!scope) {\n return {};\n }\n\n const res: Record<string, any> = {};\n\n const prototype = Object.getPrototypeOf(scope);\n const infoProps = prototype[logInfoProperties] ?? [];\n for (const prop of infoProps) {\n try {\n res[prop] = typeof scope[prop] === 'function' ? scope[prop]() : scope[prop];\n } catch (err: any) {\n res[prop] = err.message;\n }\n }\n\n return res;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, type LogFilter, type LogLevel } from './config';\nimport { type CallMetadata } from './meta';\nimport { gatherLogInfoFromScope } from './scope';\n\n/**\n * Optional object passed to the logging API.\n */\nexport type LogContext = Record<string, any> | Error | any;\n\n/**\n * Record for current log line.\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: LogContext;\n meta?: CallMetadata;\n error?: Error;\n}\n\n/**\n * Processes (e.g., prints, forwards) log entries.\n */\nexport type LogProcessor = (config: LogConfig, entry: LogEntry) => void;\n\nconst matchFilter = (filter: LogFilter, level: LogLevel, path: string) => {\n return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));\n};\n\n/**\n * Determines if the current line should be logged (called by the processor).\n */\nexport const shouldLog = (entry: LogEntry, filters?: LogFilter[]): boolean => {\n if (filters === undefined) {\n return true;\n } else {\n return filters.some((filter) => matchFilter(filter, entry.level, entry.meta?.F ?? ''));\n }\n};\n\nexport const getContextFromEntry = (entry: LogEntry): Record<string, any> | undefined => {\n let context;\n if (entry.meta) {\n const scopeInfo = gatherLogInfoFromScope(entry.meta.S);\n if (Object.keys(scopeInfo).length > 0) {\n context = Object.assign(context ?? {}, scopeInfo);\n }\n }\n\n if (entry.context) {\n if (entry.context instanceof Error) {\n // Additional context from Error.\n const c = (entry.context as any).context;\n // If ERROR then show stacktrace.\n context = Object.assign(context ?? {}, { error: entry.context.stack, ...c });\n } else if (typeof entry.context === 'object') {\n context = Object.assign(context ?? {}, entry.context);\n }\n }\n\n if (entry.error) {\n const errorContext = (entry.error as any).context;\n context = Object.assign(context ?? {}, { error: entry.error.stack, ...errorContext });\n }\n\n return context && Object.keys(context).length > 0 ? context : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport type { LogMethods } from './log';\nimport { type CallMetadata } from './meta';\n\nlet nextPromiseId = 0;\n\nexport const createMethodLogDecorator =\n (log: LogMethods) =>\n (arg0?: never, arg1?: never, meta?: CallMetadata): MethodDecorator =>\n (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const method = descriptor.value!;\n descriptor.value = function (this: any, ...args: any) {\n const combinedMeta = {\n ...(meta ?? {}),\n S: this as any,\n } as CallMetadata;\n\n const formattedArgs = args.map((arg: any) => inspect(arg, false, 1, true)).join(', ');\n\n try {\n const startTime = performance.now();\n const result = method.apply(this, args);\n\n if (isThenable(result)) {\n const id = nextPromiseId++;\n log.info(`${propertyKey as string}(${formattedArgs}) => Promise { #${id} }`, {}, combinedMeta);\n result.then(\n (resolvedValue) => {\n if (resolvedValue !== undefined) {\n log.info(\n `✅ resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms => ${inspect(\n resolvedValue,\n false,\n 1,\n true,\n )}`,\n {},\n combinedMeta,\n );\n } else {\n log.info(`✅ resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms`, {}, combinedMeta);\n }\n },\n (err) => {\n log.info(`🔥 reject #${id} #${(performance.now() - startTime).toFixed(0)}ms => ${err}`, {}, combinedMeta);\n },\n );\n } else {\n log.info(\n `${propertyKey as string}(${formattedArgs}) => ${inspect(result, false, 1, true)}`,\n {},\n combinedMeta,\n );\n }\n\n return result;\n } catch (err) {\n log.error(`${propertyKey as string}(${formattedArgs}) 🔥 ${err}`, {}, combinedMeta);\n throw err;\n }\n };\n Object.defineProperty(descriptor.value, 'name', { value: (propertyKey as string) + '$log' });\n };\n\nconst isThenable = (obj: any): obj is Promise<unknown> => obj && typeof obj.then === 'function';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { type LogConfig, type LogFilter, LogLevel, type LogOptions, LogProcessorType, levels } from './config';\nimport { type LogProcessor } from './context';\nimport { loadOptions } from './platform';\nimport { CONSOLE_PROCESSOR, DEBUG_PROCESSOR, BROWSER_PROCESSOR } from './processors';\n\n/**\n * Processor variants.\n */\nexport const processors: { [index: string]: LogProcessor } = {\n [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,\n [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,\n [LogProcessorType.DEBUG]: DEBUG_PROCESSOR,\n};\n\nconst IS_BROWSER = typeof window !== 'undefined' || typeof navigator !== 'undefined';\n\nexport const DEFAULT_PROCESSORS = [IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR];\n\nexport const parseFilter = (filter: string | string[] | LogLevel): LogFilter[] => {\n if (typeof filter === 'number') {\n return [{ level: filter }];\n }\n\n const parseLogLevel = (level: string, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;\n\n const lines = typeof filter === 'string' ? filter.split(/,\\s*/) : filter;\n return lines.map((filter) => {\n const [pattern, level] = filter.split(':');\n return level ? { level: parseLogLevel(level), pattern } : { level: parseLogLevel(pattern) };\n });\n};\n\nexport const getConfig = (options?: LogOptions): LogConfig => {\n const nodeOptions: LogOptions | undefined =\n 'process' in globalThis\n ? {\n file: process!.env.LOG_CONFIG,\n filter: process!.env.LOG_FILTER,\n processor: process!.env.LOG_PROCESSOR,\n }\n : undefined;\n\n const mergedOptions: LogOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);\n return {\n options: mergedOptions,\n filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),\n captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),\n processors: mergedOptions.processor ? [processors[mergedOptions.processor]] : DEFAULT_PROCESSORS,\n prefix: mergedOptions.prefix,\n };\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogOptions } from '../../config';\n\n// NOTE: Implementation for the browser. See `package.json`.\nexport const loadOptions = (filepath?: string): LogOptions | undefined => {\n let dxlog: string | undefined;\n // if running in a worker, use the localStorage.dxlog setting forwarded on worker initilization in\n // @dxos/client/src/worker/onconnect.ts\n if (typeof localStorage === 'undefined') {\n if ((globalThis as any).localStorage_dxlog) {\n dxlog = (globalThis as any).localStorage_dxlog;\n }\n } else {\n dxlog = localStorage.getItem('dxlog') ?? undefined;\n }\n if (!dxlog) {\n return undefined;\n }\n try {\n return JSON.parse(dxlog);\n } catch (err) {\n console.info(\"can't parse dxlog config\", err);\n return undefined;\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// TODO(wittjosiah): Consider mapping console processor directly to browser processor in the browser.\nexport const CONSOLE_PROCESSOR = () => {};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport { type LogProcessor } from '../context';\n\nexport const DEBUG_PROCESSOR: LogProcessor = (config, entry) => {\n console.log(inspect(entry, false, null, true));\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { getDebugName, safariCheck } from '@dxos/util';\n\nimport { LogLevel } from '../config';\nimport { getContextFromEntry, type LogProcessor, shouldLog } from '../context';\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n\ntype Config = {\n useTestProcessor: boolean;\n printFileLinks: boolean;\n};\n\nconst CONFIG: Config =\n typeof mochaExecutor !== 'undefined'\n ? {\n useTestProcessor: true,\n printFileLinks: true,\n }\n : {\n useTestProcessor: false,\n printFileLinks: false,\n };\n\n/**\n * For running apps in the browser normally.\n */\nconst APP_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n // Example local editor prefix: 'vscode://file/Users/burdon/Code/dxos/dxos/'.\n const LOG_BROWSER_PREFIX = config.prefix ?? 'https://vscode.dev/github.com/dxos/dxos/blob/main/';\n\n // TODO(burdon): CSS breaks formatting (e.g., [Object] rather than expandable property).\n // TODO(burdon): Consider custom formatters.\n // https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html\n // NOTE: Cannot change color of link (from bright white).\n // const LOG_BROWSER_CSS = ['color:gray; font-size:10px; padding-bottom: 4px', 'color:#B97852; font-size:14px;'];\n const LOG_BROWSER_CSS: string[] = [];\n\n let link = '';\n if (entry.meta) {\n const filename = getRelativeFilename(entry.meta.F);\n const filepath = `${LOG_BROWSER_PREFIX.replace(/\\/$/, '')}/${filename}`;\n // TODO(burdon): Line numbers not working for app link, even with colons.\n // https://stackoverflow.com/a/54459820/2804332\n link = `${filepath}#L${entry.meta.L}`;\n }\n\n let args = [];\n\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n const scopeName = scope.name || getDebugName(scope);\n const processPrefix = entry.meta.S?.hostSessionId ? '[worker] ' : '';\n // TODO(dmaretskyi): Those can be made clickable with a custom formatter.\n args.push(`%c${processPrefix}${scopeName}`, 'color:#C026D3;font-weight:bold');\n }\n\n args.push(entry.message);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n // Safari prints source code location as this file, not the caller.\n if (CONFIG.printFileLinks || safariCheck()) {\n if (LOG_BROWSER_CSS?.length) {\n args = [`%c${link}\\n%c${args.join(' ')}`, ...LOG_BROWSER_CSS];\n } else {\n args = [link + '\\n', ...args];\n }\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\n/**\n * For running unit tests in the headless browser.\n */\nconst TEST_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n let path = '';\n if (entry.meta) {\n path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;\n }\n\n let args = [];\n\n const processPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n args.push(`${processPrefix}${entry.message}`);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n if (CONFIG.printFileLinks) {\n args = [path, ...args];\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\nexport const BROWSER_PROCESSOR: LogProcessor = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { appendFileSync, mkdirSync, openSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { jsonify } from '@dxos/util';\n\nimport { type LogFilter, LogLevel } from '../config';\nimport { type LogProcessor, getContextFromEntry, shouldLog } from '../context';\n\n/**\n * Create a file processor.\n * @param path - Path to log file to create or append to, or existing open file descriptor e.g. stdout.\n * @param levels - Log levels to process. Takes preference over Filters.\n * @param filters - Filters to apply.\n */\nexport const createFileProcessor = ({\n pathOrFd,\n levels,\n filters,\n}: {\n pathOrFd: string | number;\n levels: LogLevel[];\n filters?: LogFilter[];\n}): LogProcessor => {\n let fd: number | undefined;\n\n return (config, entry) => {\n if (levels.length > 0 && !levels.includes(entry.level)) {\n return;\n }\n if (!shouldLog(entry, filters)) {\n return;\n }\n if (typeof pathOrFd === 'number') {\n fd = pathOrFd;\n } else {\n try {\n mkdirSync(dirname(pathOrFd));\n } catch {}\n fd = openSync(pathOrFd, 'w');\n }\n\n const record = {\n ...entry,\n timestamp: Date.now(),\n meta: {\n file: entry.meta?.F,\n line: entry.meta?.L,\n },\n context: jsonify(getContextFromEntry(entry)),\n };\n appendFileSync(fd, JSON.stringify(record) + '\\n');\n };\n};\n\nlet logFilePath: string | undefined;\nconst getLogFilePath = () => {\n logFilePath ??=\n process.env.LOG_FILE ??\n (process.env.HOME ? `${process.env.HOME}/.dxlog/${new Date().toISOString()}.log` : undefined);\n\n return logFilePath!;\n};\n\nexport const FILE_PROCESSOR: LogProcessor = createFileProcessor({\n pathOrFd: getLogFilePath(),\n levels: [LogLevel.ERROR, LogLevel.WARN, LogLevel.INFO, LogLevel.TRACE],\n});\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, LogLevel, type LogOptions } from './config';\nimport { type LogContext, type LogProcessor } from './context';\nimport { createMethodLogDecorator } from './decorators';\nimport { type CallMetadata } from './meta';\nimport { getConfig, DEFAULT_PROCESSORS } from './options';\n\n/**\n * Logging function.\n */\ntype LogFunction = (message: string, context?: LogContext, meta?: CallMetadata) => void;\n\n/**\n * Logging methods.\n */\nexport interface LogMethods {\n trace: LogFunction;\n debug: LogFunction;\n info: LogFunction;\n warn: LogFunction;\n error: LogFunction;\n catch: (error: Error | any, context?: LogContext, meta?: CallMetadata) => void;\n break: () => void;\n stack: (message?: string, context?: never, meta?: CallMetadata) => void;\n method: (arg0?: never, arg1?: never, meta?: CallMetadata) => MethodDecorator;\n}\n\n/**\n * Properties accessible on the logging function.\n */\ninterface Log extends LogMethods, LogFunction {\n config: (options: LogOptions) => void;\n addProcessor: (processor: LogProcessor) => void;\n runtimeConfig: LogConfig;\n}\n\ninterface LogImp extends Log {\n _config: LogConfig;\n}\n\nconst createLog = (): LogImp => {\n const log: LogImp = ((...params) => processLog(LogLevel.DEBUG, ...params)) as LogImp;\n\n log._config = getConfig();\n Object.defineProperty(log, 'runtimeConfig', { get: () => log._config });\n\n log.addProcessor = (processor: LogProcessor) => {\n if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {\n DEFAULT_PROCESSORS.push(processor);\n }\n if (log._config.processors.filter((p) => p === processor).length === 0) {\n log._config.processors.push(processor);\n }\n };\n\n // Set config.\n log.config = (options: LogOptions) => {\n log._config = getConfig(options);\n };\n\n // TODO(burdon): API to set context and separate error object.\n // E.g., log.warn('failed', { key: 123 }, err);\n\n log.trace = (...params) => processLog(LogLevel.TRACE, ...params);\n log.debug = (...params) => processLog(LogLevel.DEBUG, ...params);\n log.info = (...params) => processLog(LogLevel.INFO, ...params);\n log.warn = (...params) => processLog(LogLevel.WARN, ...params);\n log.error = (...params) => processLog(LogLevel.ERROR, ...params);\n\n // Catch only shows error message, not stacktrace.\n log.catch = (error: Error | any, context, meta) => processLog(LogLevel.ERROR, error.stack, context, meta, error);\n\n // Show break.\n log.break = () => log.info('——————————————————————————————————————————————————');\n\n log.stack = (message, context, meta) =>\n processLog(LogLevel.INFO, `${message ?? 'Stack Dump'}\\n${getFormattedStackTrace()}`, context, meta);\n\n log.method = createMethodLogDecorator(log);\n\n /**\n * Process the current log call.\n */\n const processLog = (\n level: LogLevel,\n message: string,\n context: LogContext = {},\n meta?: CallMetadata,\n error?: Error,\n ) => {\n log._config.processors.forEach((processor) => processor(log._config, { level, message, context, meta, error }));\n };\n\n return log;\n};\n\n/**\n * Global logging function.\n */\nexport const log: Log = ((globalThis as any).dx_log ??= createLog());\n\n/**\n * Accessible from browser console.\n */\ndeclare global {\n // eslint-disable-next-line camelcase\n const dx_log: Log;\n}\n\nconst getFormattedStackTrace = () => new Error().stack!.split('\\n').slice(3).join('\\n');\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nconst kOwnershipScope = Symbol('kOwnershipScope');\nconst kCurrentOwnershipScope = Symbol('kCurrentOwnershipScope');\nconst kDebugInfoProperties = Symbol('kDebugInfoProperties');\n\n/**\n *\n */\n// TODO(burdon): Document.\nexport class OwnershipScope {\n public instance: any;\n\n constructor(\n public constr: any,\n public parent?: OwnershipScope,\n ) {}\n\n getInfo() {\n if (!this.instance) {\n return {};\n }\n const props = this.constr.prototype[kDebugInfoProperties] ?? [];\n const info: any = {};\n for (const prop of props) {\n info[prop] = this.instance[prop];\n }\n return info;\n }\n\n [inspect.custom]() {\n return {\n className: this.constr.name,\n info: this.getInfo(),\n parent: this.parent,\n };\n }\n}\n\nfunction decorateMethodWeakReturnOwnership(prototype: any, key: string) {\n const original = prototype[key];\n prototype[key] = function (...args: any) {\n const res = original.apply(this, ...args);\n\n if (res && typeof res.then === 'function') {\n res.then((value: any) => {\n if (kOwnershipScope in value) {\n value[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n });\n } else {\n if (res && kOwnershipScope in res) {\n res[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n }\n\n return res;\n };\n}\n\nexport function ownershipClass<T extends { new (...args: any[]): {} }>(constr: T) {\n for (const key of Object.getOwnPropertyNames(constr.prototype)) {\n if (key !== 'constructor' && typeof constr.prototype[key] === 'function') {\n decorateMethodWeakReturnOwnership(constr.prototype, key);\n }\n }\n\n return class extends constr {\n constructor(...args: any[]) {\n const currentCausality = (globalThis as any)[kCurrentOwnershipScope];\n (globalThis as any)[kCurrentOwnershipScope] = new OwnershipScope(constr, currentCausality);\n super(...args);\n (this as any)[kOwnershipScope] = (globalThis as any)[kCurrentOwnershipScope];\n (this as any)[kOwnershipScope].instance = this;\n (globalThis as any)[kCurrentOwnershipScope] = currentCausality;\n }\n };\n}\n\nexport const debugInfo = (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[kDebugInfoProperties] ??= []).push(propertyKey);\n};\n\nexport const getCurrentOwnershipScope = (thisRef: any) => thisRef;\n"],
5
+ "mappings": "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",
6
+ "names": ["omit", "pick", "LogLevel", "levels", "trace", "debug", "info", "warn", "error", "shortLevelName", "LogProcessorType", "logInfoProperties", "Symbol", "logInfo", "target", "propertyKey", "descriptor", "push", "gatherLogInfoFromScope", "scope", "res", "prototype", "Object", "getPrototypeOf", "infoProps", "prop", "err", "message", "matchFilter", "filter", "level", "path", "pattern", "includes", "shouldLog", "entry", "filters", "undefined", "some", "meta", "F", "getContextFromEntry", "context", "scopeInfo", "gatherLogInfoFromScope", "S", "Object", "keys", "length", "assign", "Error", "c", "error", "stack", "errorContext", "inspect", "nextPromiseId", "createMethodLogDecorator", "log", "arg0", "arg1", "meta", "target", "propertyKey", "descriptor", "method", "value", "args", "combinedMeta", "S", "formattedArgs", "map", "arg", "inspect", "join", "startTime", "performance", "now", "result", "apply", "isThenable", "id", "info", "then", "resolvedValue", "undefined", "toFixed", "err", "error", "Object", "defineProperty", "obj", "defaultsDeep", "loadOptions", "filepath", "dxlog", "localStorage", "globalThis", "localStorage_dxlog", "getItem", "undefined", "JSON", "parse", "err", "console", "info", "CONSOLE_PROCESSOR", "inspect", "DEBUG_PROCESSOR", "config", "entry", "console", "log", "inspect", "getDebugName", "safariCheck", "getRelativeFilename", "filename", "match", "filePath", "CONFIG", "mochaExecutor", "useTestProcessor", "printFileLinks", "APP_BROWSER_PROCESSOR", "config", "entry", "shouldLog", "filters", "LOG_BROWSER_PREFIX", "prefix", "LOG_BROWSER_CSS", "link", "meta", "F", "filepath", "replace", "L", "args", "S", "scope", "scopeName", "name", "getDebugName", "processPrefix", "hostSessionId", "push", "message", "context", "getContextFromEntry", "levels", "LogLevel", "ERROR", "console", "error", "WARN", "warn", "DEBUG", "log", "safariCheck", "length", "join", "level", "C", "TEST_BROWSER_PROCESSOR", "path", "BROWSER_PROCESSOR", "appendFileSync", "mkdirSync", "openSync", "dirname", "jsonify", "createFileProcessor", "pathOrFd", "levels", "filters", "fd", "config", "entry", "length", "includes", "level", "shouldLog", "mkdirSync", "dirname", "openSync", "record", "timestamp", "Date", "now", "meta", "file", "F", "line", "L", "context", "jsonify", "getContextFromEntry", "appendFileSync", "JSON", "stringify", "logFilePath", "getLogFilePath", "process", "env", "LOG_FILE", "HOME", "toISOString", "undefined", "FILE_PROCESSOR", "LogLevel", "ERROR", "WARN", "INFO", "TRACE", "processors", "LogProcessorType", "CONSOLE", "CONSOLE_PROCESSOR", "BROWSER", "BROWSER_PROCESSOR", "DEBUG", "DEBUG_PROCESSOR", "IS_BROWSER", "window", "navigator", "DEFAULT_PROCESSORS", "parseFilter", "filter", "level", "parseLogLevel", "defValue", "LogLevel", "WARN", "levels", "toLowerCase", "lines", "split", "map", "pattern", "getConfig", "options", "nodeOptions", "globalThis", "file", "process", "env", "LOG_CONFIG", "LOG_FILTER", "processor", "LOG_PROCESSOR", "undefined", "mergedOptions", "defaultsDeep", "loadOptions", "filters", "INFO", "captureFilters", "captureFilter", "prefix", "createLog", "log", "params", "processLog", "LogLevel", "DEBUG", "_config", "getConfig", "Object", "defineProperty", "get", "addProcessor", "processor", "DEFAULT_PROCESSORS", "filter", "p", "length", "push", "processors", "config", "options", "trace", "TRACE", "debug", "info", "INFO", "warn", "WARN", "error", "ERROR", "catch", "context", "meta", "stack", "break", "message", "getFormattedStackTrace", "method", "createMethodLogDecorator", "level", "forEach", "globalThis", "dx_log", "Error", "split", "slice", "join", "inspect", "kOwnershipScope", "Symbol", "kCurrentOwnershipScope", "kDebugInfoProperties", "OwnershipScope", "constructor", "constr", "parent", "getInfo", "instance", "props", "prototype", "info", "prop", "inspect", "custom", "className", "name", "getCurrentOwnershipScope", "thisRef"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/log/src/config.ts":{"bytes":3536,"imports":[],"format":"esm"},"packages/common/log/src/scope.ts":{"bytes":3852,"imports":[],"format":"esm"},"packages/common/log/src/context.ts":{"bytes":6618,"imports":[{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"}],"format":"esm"},"packages/common/log/src/decorators.ts":{"bytes":13956,"imports":[{"path":"chalk","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/platform/browser/index.ts":{"bytes":2848,"imports":[],"format":"esm"},"packages/common/log/src/platform/index.ts":{"bytes":460,"imports":[{"path":"packages/common/log/src/platform/browser/index.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/common/log/src/processors/console-stub.ts":{"bytes":828,"imports":[],"format":"esm"},"packages/common/log/src/processors/debug-processor.ts":{"bytes":1070,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/processors/browser-processor.ts":{"bytes":14794,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/file-processor.ts":{"bytes":9703,"imports":[{"path":"@dxos/node-std/fs","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/index.ts":{"bytes":817,"imports":[{"path":"packages/common/log/src/processors/console-stub.ts","kind":"import-statement","original":"./console-processor"},{"path":"packages/common/log/src/processors/debug-processor.ts","kind":"import-statement","original":"./debug-processor"},{"path":"packages/common/log/src/processors/browser-processor.ts","kind":"import-statement","original":"./browser-processor"},{"path":"packages/common/log/src/processors/file-processor.ts","kind":"import-statement","original":"./file-processor"}],"format":"esm"},"packages/common/log/src/options.ts":{"bytes":7558,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/platform/index.ts","kind":"import-statement","original":"./platform"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"}],"format":"esm"},"packages/common/log/src/log.ts":{"bytes":10313,"imports":[{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/decorators.ts","kind":"import-statement","original":"./decorators"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"}],"format":"esm"},"packages/common/log/src/meta.ts":{"bytes":1625,"imports":[],"format":"esm"},"packages/common/log/src/experimental/ownership.ts":{"bytes":9286,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/index.ts":{"bytes":1663,"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"./context"},{"path":"packages/common/log/src/log.ts","kind":"import-statement","original":"./log"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"},{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"},{"path":"packages/common/log/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/common/log/src/experimental/ownership.ts","kind":"import-statement","original":"./experimental/ownership"}],"format":"esm"}},"outputs":{"packages/common/log/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":42504},"packages/common/log/dist/lib/browser/index.mjs":{"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"chalk","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/node-std/fs","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"exports":["BROWSER_PROCESSOR","CONSOLE_PROCESSOR","DEBUG_PROCESSOR","FILE_PROCESSOR","LogLevel","LogProcessorType","createFileProcessor","gatherLogInfoFromScope","getContextFromEntry","getCurrentOwnershipScope","levels","log","logInfo","omit","parseFilter","pick","shortLevelName","shouldLog"],"entryPoint":"packages/common/log/src/index.ts","inputs":{"packages/common/log/src/index.ts":{"bytesInOutput":64},"packages/common/log/src/config.ts":{"bytesInOutput":703},"packages/common/log/src/scope.ts":{"bytesInOutput":571},"packages/common/log/src/context.ts":{"bytesInOutput":1153},"packages/common/log/src/decorators.ts":{"bytesInOutput":3148},"packages/common/log/src/options.ts":{"bytesInOutput":1542},"packages/common/log/src/platform/browser/index.ts":{"bytesInOutput":424},"packages/common/log/src/platform/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/console-stub.ts":{"bytesInOutput":35},"packages/common/log/src/processors/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/debug-processor.ts":{"bytesInOutput":156},"packages/common/log/src/processors/browser-processor.ts":{"bytesInOutput":2759},"packages/common/log/src/processors/file-processor.ts":{"bytesInOutput":1762},"packages/common/log/src/log.ts":{"bytesInOutput":1930},"packages/common/log/src/experimental/ownership.ts":{"bytesInOutput":792}},"bytes":16029}}}
1
+ {"inputs":{"packages/common/log/src/config.ts":{"bytes":3536,"imports":[],"format":"esm"},"packages/common/log/src/scope.ts":{"bytes":3852,"imports":[],"format":"esm"},"packages/common/log/src/context.ts":{"bytes":6644,"imports":[{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"}],"format":"esm"},"packages/common/log/src/decorators.ts":{"bytes":8231,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/platform/browser/index.ts":{"bytes":2848,"imports":[],"format":"esm"},"packages/common/log/src/platform/index.ts":{"bytes":460,"imports":[{"path":"packages/common/log/src/platform/browser/index.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/common/log/src/processors/console-stub.ts":{"bytes":828,"imports":[],"format":"esm"},"packages/common/log/src/processors/debug-processor.ts":{"bytes":1070,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/processors/browser-processor.ts":{"bytes":14799,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/file-processor.ts":{"bytes":6675,"imports":[{"path":"@dxos/node-std/fs","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/index.ts":{"bytes":817,"imports":[{"path":"packages/common/log/src/processors/console-stub.ts","kind":"import-statement","original":"./console-processor"},{"path":"packages/common/log/src/processors/debug-processor.ts","kind":"import-statement","original":"./debug-processor"},{"path":"packages/common/log/src/processors/browser-processor.ts","kind":"import-statement","original":"./browser-processor"},{"path":"packages/common/log/src/processors/file-processor.ts","kind":"import-statement","original":"./file-processor"}],"format":"esm"},"packages/common/log/src/options.ts":{"bytes":7558,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/platform/index.ts","kind":"import-statement","original":"./platform"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"}],"format":"esm"},"packages/common/log/src/log.ts":{"bytes":10311,"imports":[{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/decorators.ts","kind":"import-statement","original":"./decorators"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"}],"format":"esm"},"packages/common/log/src/meta.ts":{"bytes":1625,"imports":[],"format":"esm"},"packages/common/log/src/experimental/ownership.ts":{"bytes":9286,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/index.ts":{"bytes":1663,"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"./context"},{"path":"packages/common/log/src/log.ts","kind":"import-statement","original":"./log"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"},{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"},{"path":"packages/common/log/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/common/log/src/experimental/ownership.ts","kind":"import-statement","original":"./experimental/ownership"}],"format":"esm"}},"outputs":{"packages/common/log/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":37819},"packages/common/log/dist/lib/browser/index.mjs":{"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/node-std/fs","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true}],"exports":["BROWSER_PROCESSOR","CONSOLE_PROCESSOR","DEBUG_PROCESSOR","FILE_PROCESSOR","LogLevel","LogProcessorType","createFileProcessor","gatherLogInfoFromScope","getContextFromEntry","getCurrentOwnershipScope","levels","log","logInfo","omit","parseFilter","pick","shortLevelName","shouldLog"],"entryPoint":"packages/common/log/src/index.ts","inputs":{"packages/common/log/src/index.ts":{"bytesInOutput":64},"packages/common/log/src/config.ts":{"bytesInOutput":703},"packages/common/log/src/scope.ts":{"bytesInOutput":571},"packages/common/log/src/context.ts":{"bytesInOutput":1159},"packages/common/log/src/decorators.ts":{"bytesInOutput":1662},"packages/common/log/src/options.ts":{"bytesInOutput":1542},"packages/common/log/src/platform/browser/index.ts":{"bytesInOutput":424},"packages/common/log/src/platform/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/console-stub.ts":{"bytesInOutput":35},"packages/common/log/src/processors/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/debug-processor.ts":{"bytesInOutput":156},"packages/common/log/src/processors/browser-processor.ts":{"bytesInOutput":2759},"packages/common/log/src/processors/file-processor.ts":{"bytesInOutput":1262},"packages/common/log/src/log.ts":{"bytesInOutput":1928},"packages/common/log/src/experimental/ownership.ts":{"bytesInOutput":792}},"bytes":14047}}}
@@ -53,12 +53,11 @@ __export(node_exports, {
53
53
  module.exports = __toCommonJS(node_exports);
54
54
  var import_lodash = __toESM(require("lodash.omit"));
55
55
  var import_lodash2 = __toESM(require("lodash.pick"));
56
- var import_chalk = __toESM(require("chalk"));
57
56
  var import_node_util = require("node:util");
58
57
  var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
59
58
  var import_js_yaml = __toESM(require("js-yaml"));
60
59
  var import_node_fs = __toESM(require("node:fs"));
61
- var import_chalk2 = __toESM(require("chalk"));
60
+ var import_chalk = __toESM(require("chalk"));
62
61
  var import_lodash4 = __toESM(require("lodash.pickby"));
63
62
  var import_node_util2 = require("node:util");
64
63
  var import_util = require("@dxos/util");
@@ -148,7 +147,7 @@ var getContextFromEntry = (entry) => {
148
147
  if (entry.error) {
149
148
  const errorContext = entry.error.context;
150
149
  context = Object.assign(context ?? {}, {
151
- error: entry.error,
150
+ error: entry.error.stack,
152
151
  ...errorContext
153
152
  });
154
153
  }
@@ -157,7 +156,6 @@ var getContextFromEntry = (entry) => {
157
156
  var nextPromiseId = 0;
158
157
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
159
158
  const method = descriptor.value;
160
- const methodName = propertyKey;
161
159
  descriptor.value = function(...args) {
162
160
  const combinedMeta = {
163
161
  ...meta ?? {},
@@ -169,54 +167,30 @@ var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, property
169
167
  const result = method.apply(this, args);
170
168
  if (isThenable(result)) {
171
169
  const id = nextPromiseId++;
172
- logAsyncBegin(log2, methodName, formattedArgs, id, combinedMeta);
170
+ log2.info(`${propertyKey}(${formattedArgs}) => Promise { #${id} }`, {}, combinedMeta);
173
171
  result.then((resolvedValue) => {
174
- logAsyncResolved(log2, methodName, resolvedValue, id, startTime, combinedMeta);
172
+ if (resolvedValue !== void 0) {
173
+ log2.info(`\u2705 resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms => ${(0, import_node_util.inspect)(resolvedValue, false, 1, true)}`, {}, combinedMeta);
174
+ } else {
175
+ log2.info(`\u2705 resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms`, {}, combinedMeta);
176
+ }
175
177
  }, (err) => {
176
- logAsyncRejected(log2, methodName, err, id, startTime, combinedMeta);
178
+ log2.info(`\u{1F525} reject #${id} #${(performance.now() - startTime).toFixed(0)}ms => ${err}`, {}, combinedMeta);
177
179
  });
178
180
  } else {
179
- logSyncCall(log2, methodName, formattedArgs, result, combinedMeta);
181
+ log2.info(`${propertyKey}(${formattedArgs}) => ${(0, import_node_util.inspect)(result, false, 1, true)}`, {}, combinedMeta);
180
182
  }
181
183
  return result;
182
184
  } catch (err) {
183
- logSyncError(log2, methodName, formattedArgs, err, combinedMeta);
185
+ log2.error(`${propertyKey}(${formattedArgs}) \u{1F525} ${err}`, {}, combinedMeta);
184
186
  throw err;
185
187
  }
186
188
  };
187
189
  Object.defineProperty(descriptor.value, "name", {
188
- value: methodName + "$log"
190
+ value: propertyKey + "$log"
189
191
  });
190
192
  };
191
193
  var isThenable = (obj) => obj && typeof obj.then === "function";
192
- var logSyncCall = (log2, methodName, formattedArgs, result, combinedMeta) => {
193
- log2.info(`.${formatFunction(methodName)} (${formattedArgs}) ${import_chalk.default.gray("resolve")} ${(0, import_node_util.inspect)(result, false, 1, true)}`, {}, combinedMeta);
194
- };
195
- var logSyncError = (log2, methodName, formattedArgs, err, combinedMeta) => {
196
- log2.error(`.${formatFunction(methodName)} (${formattedArgs}) \u{1F525} ${err}`, {}, combinedMeta);
197
- };
198
- var logAsyncBegin = (log2, methodName, formattedArgs, promiseId, combinedMeta) => {
199
- log2.info(`.${formatFunction(methodName)} \u21B4 (${formattedArgs}) ${import_chalk.default.gray("=>")} ${formatPromise(promiseId)}`, {}, combinedMeta);
200
- };
201
- var logAsyncResolved = (log2, methodName, resolvedValue, promiseId, startTime, combinedMeta) => {
202
- if (resolvedValue !== void 0) {
203
- log2.info(`.${formatFunction(methodName)} \u21B2 ${greenCheck} ${import_chalk.default.gray("resolve")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${import_chalk.default.gray("=>")} ${(0, import_node_util.inspect)(resolvedValue, false, 1, true)}`, {}, combinedMeta);
204
- } else {
205
- log2.info(`.${formatFunction(methodName)} \u21B2 ${greenCheck} ${import_chalk.default.gray("resolve")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)}`, {}, combinedMeta);
206
- }
207
- };
208
- var logAsyncRejected = (log2, methodName, err, promiseId, startTime, combinedMeta) => {
209
- log2.info(`.${formatFunction(methodName)} \u21B2 \u{1F525} ${import_chalk.default.gray("reject")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${import_chalk.default.gray("=>")} ${err}`, {}, combinedMeta);
210
- };
211
- var greenCheck = import_chalk.default.green("\u2714");
212
- var formatTimeElapsed = (startTime) => import_chalk.default.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
213
- var COLOR_FUNCTION = [
214
- 220,
215
- 220,
216
- 170
217
- ];
218
- var formatFunction = (name) => import_chalk.default.bold(import_chalk.default.rgb(...COLOR_FUNCTION)(name));
219
- var formatPromise = (id) => import_chalk.default.blue(`Promise#${id}`);
220
194
  var loadOptions = (filepath) => {
221
195
  if (filepath) {
222
196
  try {
@@ -248,17 +222,17 @@ var getRelativeFilename = (filename) => {
248
222
  }
249
223
  return filename;
250
224
  };
251
- var DEFAULT_FORMATTER = (config, { path, line, level, message, context, error, scope }) => {
225
+ var DEFAULT_FORMATTER = (config, { path, line, timestamp, level, message, context, error, scope }) => {
252
226
  const column = config.options?.formatter?.column;
253
- const filepath = path !== void 0 && line !== void 0 ? import_chalk2.default.grey(`${path}:${line}`) : void 0;
227
+ const filepath = path !== void 0 && line !== void 0 ? import_chalk.default.grey(`${path}:${line}`) : void 0;
254
228
  let instance;
255
229
  if (scope) {
256
230
  const prototype = Object.getPrototypeOf(scope);
257
231
  const id = (0, import_util.getPrototypeSpecificInstanceId)(scope);
258
- instance = import_chalk2.default.magentaBright(`${prototype.constructor.name}#${id}`);
232
+ instance = import_chalk.default.magentaBright(`${prototype.constructor.name}#${id}`);
259
233
  }
260
234
  const formattedTimestamp = config.options?.formatter?.timestamp ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
261
- const formattedLevel = import_chalk2.default[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);
235
+ const formattedLevel = import_chalk.default[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);
262
236
  const padding = column && filepath ? "".padStart(column - filepath.length) : void 0;
263
237
  return config.options?.formatter?.timestampFirst ? [
264
238
  formattedTimestamp,
@@ -282,13 +256,11 @@ var DEFAULT_FORMATTER = (config, { path, line, level, message, context, error, s
282
256
  error
283
257
  ];
284
258
  };
285
- var SHORT_FORMATTER = (config, { path, level, message }) => {
286
- return [
287
- import_chalk2.default.grey(truncate(path, 16, true)),
288
- import_chalk2.default[LEVEL_COLORS[level]](shortLevelName[level]),
289
- message
290
- ];
291
- };
259
+ var SHORT_FORMATTER = (config, { path, level, message }) => [
260
+ import_chalk.default.grey(truncate(path, 16, true)),
261
+ import_chalk.default[LEVEL_COLORS[level]](shortLevelName[level]),
262
+ message
263
+ ];
292
264
  var formatter = DEFAULT_FORMATTER;
293
265
  var CONSOLE_PROCESSOR = (config, entry) => {
294
266
  const { level, message, meta, error } = entry;
@@ -423,7 +395,6 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
423
395
  }
424
396
  };
425
397
  var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;
426
- var EAGAIN_MAX_DURATION = 1e3;
427
398
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
428
399
  let fd;
429
400
  return (config, entry) => {
@@ -451,24 +422,7 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
451
422
  },
452
423
  context: (0, import_util3.jsonify)(getContextFromEntry(entry))
453
424
  };
454
- let retryTS = 0;
455
- while (true) {
456
- try {
457
- return (0, import_node_fs2.appendFileSync)(fd, JSON.stringify(record) + "\n");
458
- } catch (err) {
459
- if (err.code !== "EAGAIN") {
460
- throw err;
461
- }
462
- if (retryTS === 0) {
463
- retryTS = performance.now();
464
- } else {
465
- if (performance.now() - retryTS > EAGAIN_MAX_DURATION) {
466
- console.log(`could not write after ${EAGAIN_MAX_DURATION}ms of EAGAIN failures, giving up`);
467
- throw err;
468
- }
469
- }
470
- }
471
- }
425
+ (0, import_node_fs2.appendFileSync)(fd, JSON.stringify(record) + "\n");
472
426
  };
473
427
  };
474
428
  var logFilePath;
@@ -553,7 +507,7 @@ var createLog = () => {
553
507
  log2.info = (...params) => processLog(LogLevel.INFO, ...params);
554
508
  log2.warn = (...params) => processLog(LogLevel.WARN, ...params);
555
509
  log2.error = (...params) => processLog(LogLevel.ERROR, ...params);
556
- log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, error.message, context, meta, error);
510
+ log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, error.stack, context, meta, error);
557
511
  log2.break = () => log2.info("\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014");
558
512
  log2.stack = (message, context, meta) => processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
559
513
  ${getFormattedStackTrace()}`, context, meta);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts", "../../../src/config.ts", "../../../src/scope.ts", "../../../src/context.ts", "../../../src/decorators.ts", "../../../src/options.ts", "../../../src/platform/node/index.ts", "../../../src/processors/console-processor.ts", "../../../src/processors/debug-processor.ts", "../../../src/processors/browser-processor.ts", "../../../src/processors/file-processor.ts", "../../../src/log.ts", "../../../src/experimental/ownership.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\n// Message helpers.\nimport omit from 'lodash.omit';\nimport pick from 'lodash.pick';\n\nexport { omit, pick };\n\nexport * from './config';\nexport * from './context';\nexport * from './log';\nexport { parseFilter } from './options';\nexport * from './processors';\nexport * from './scope';\nexport * from './meta';\n\nexport { getCurrentOwnershipScope } from './experimental/ownership';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogProcessor } from './context';\n\n/**\n * Standard levels.\n */\n// NOTE: Keep aligned with LogLevel in @dxos/protocols.\n// TODO(burdon): Update numbers?\nexport enum LogLevel {\n TRACE = 5,\n DEBUG = 10,\n INFO = 11,\n WARN = 12,\n ERROR = 13,\n}\n\nexport const levels: { [index: string]: LogLevel } = {\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n};\n\nexport const shortLevelName = {\n [LogLevel.TRACE]: 'T',\n [LogLevel.DEBUG]: 'D',\n [LogLevel.INFO]: 'I',\n [LogLevel.WARN]: 'W',\n [LogLevel.ERROR]: 'E',\n};\n\nexport enum LogProcessorType {\n CONSOLE = 'console',\n BROWSER = 'browser',\n DEBUG = 'debug',\n}\n\n/**\n * Individual filter condition.\n */\nexport type LogFilter = {\n level: LogLevel;\n pattern?: string;\n};\n\n/**\n * Options to set inline or load from the YML file.\n */\nexport type LogOptions = {\n file?: string;\n filter?: string | string[] | LogLevel;\n captureFilter?: string | string[] | LogLevel;\n depth?: number; // Context object depth.\n processor?: string | LogProcessorType;\n formatter?: {\n column: number;\n timestamp: boolean;\n timestampFirst: boolean;\n };\n prefix?: string;\n};\n\n/**\n * Runtime config.\n */\nexport interface LogConfig {\n options: LogOptions;\n filters?: LogFilter[];\n captureFilters?: LogFilter[];\n processors: LogProcessor[];\n prefix?: string;\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nconst logInfoProperties = Symbol('logInfoProperties');\n\n/**\n * Decorate fields, properties, or methods to automatically include their values in log messages.\n *\n * Example:\n *\n * ```typescript\n * class Example {\n * @logInfo\n * peerId: PublicKey;\n * }\n * ```\n */\nexport const logInfo = (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[logInfoProperties] ??= []).push(propertyKey);\n};\n\n/**\n * Introspects class instance to find decorated metadata.\n * @param scope Class instance.\n */\nexport const gatherLogInfoFromScope = (scope: any): Record<string, any> => {\n if (!scope) {\n return {};\n }\n\n const res: Record<string, any> = {};\n\n const prototype = Object.getPrototypeOf(scope);\n const infoProps = prototype[logInfoProperties] ?? [];\n for (const prop of infoProps) {\n try {\n res[prop] = typeof scope[prop] === 'function' ? scope[prop]() : scope[prop];\n } catch (err: any) {\n res[prop] = err.message;\n }\n }\n\n return res;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, type LogFilter, type LogLevel } from './config';\nimport { type CallMetadata } from './meta';\nimport { gatherLogInfoFromScope } from './scope';\n\n/**\n * Optional object passed to the logging API.\n */\nexport type LogContext = Record<string, any> | Error | any;\n\n/**\n * Record for current log line.\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: LogContext;\n meta?: CallMetadata;\n error?: Error;\n}\n\n/**\n * Processes (e.g., prints, forwards) log entries.\n */\nexport type LogProcessor = (config: LogConfig, entry: LogEntry) => void;\n\nconst matchFilter = (filter: LogFilter, level: LogLevel, path: string) => {\n return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));\n};\n\n/**\n * Determines if the current line should be logged (called by the processor).\n */\nexport const shouldLog = (entry: LogEntry, filters?: LogFilter[]): boolean => {\n if (filters === undefined) {\n return true;\n } else {\n return filters.some((filter) => matchFilter(filter, entry.level, entry.meta?.F ?? ''));\n }\n};\n\nexport const getContextFromEntry = (entry: LogEntry): Record<string, any> | undefined => {\n let context;\n if (entry.meta) {\n const scopeInfo = gatherLogInfoFromScope(entry.meta.S);\n if (Object.keys(scopeInfo).length > 0) {\n context = Object.assign(context ?? {}, scopeInfo);\n }\n }\n\n if (entry.context) {\n if (entry.context instanceof Error) {\n // Additional context from Error.\n const c = (entry.context as any).context;\n // If ERROR then show stacktrace.\n context = Object.assign(context ?? {}, { error: entry.context.stack, ...c });\n } else if (typeof entry.context === 'object') {\n context = Object.assign(context ?? {}, entry.context);\n }\n }\n\n if (entry.error) {\n const errorContext = (entry.error as any).context;\n context = Object.assign(context ?? {}, { error: entry.error, ...errorContext });\n }\n\n return context && Object.keys(context).length > 0 ? context : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport chalk from 'chalk';\nimport { inspect } from 'node:util';\n\nimport type { LogMethods } from './log';\nimport { type CallMetadata } from './meta';\n\nlet nextPromiseId = 0;\n\nexport const createMethodLogDecorator =\n (log: LogMethods) =>\n (arg0?: never, arg1?: never, meta?: CallMetadata): MethodDecorator =>\n (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const method = descriptor.value!;\n const methodName = propertyKey as string;\n descriptor.value = function (this: any, ...args: any) {\n const combinedMeta = {\n ...(meta ?? {}),\n S: this as any,\n } as CallMetadata;\n\n const formattedArgs = args.map((arg: any) => inspect(arg, false, 1, true)).join(', ');\n\n try {\n const startTime = performance.now();\n const result = method.apply(this, args);\n\n if (isThenable(result)) {\n const id = nextPromiseId++;\n logAsyncBegin(log, methodName, formattedArgs, id, combinedMeta);\n result.then(\n (resolvedValue) => {\n logAsyncResolved(log, methodName, resolvedValue, id, startTime, combinedMeta);\n },\n (err) => {\n logAsyncRejected(log, methodName, err, id, startTime, combinedMeta);\n },\n );\n } else {\n logSyncCall(log, methodName, formattedArgs, result, combinedMeta);\n }\n\n return result;\n } catch (err: any) {\n logSyncError(log, methodName, formattedArgs, err, combinedMeta);\n throw err;\n }\n };\n Object.defineProperty(descriptor.value, 'name', { value: methodName + '$log' });\n };\n\nconst isThenable = (obj: any): obj is Promise<unknown> => obj && typeof obj.then === 'function';\n\nconst logSyncCall = (\n log: LogMethods,\n methodName: string,\n formattedArgs: string,\n result: unknown,\n combinedMeta: CallMetadata,\n) => {\n log.info(\n `.${formatFunction(methodName)} (${formattedArgs}) ${chalk.gray('resolve')} ${inspect(result, false, 1, true)}`,\n {},\n combinedMeta,\n );\n};\n\nconst logSyncError = (\n log: LogMethods,\n methodName: string,\n formattedArgs: string,\n err: Error,\n combinedMeta: CallMetadata,\n) => {\n log.error(`.${formatFunction(methodName)} (${formattedArgs}) 🔥 ${err}`, {}, combinedMeta);\n};\n\nconst logAsyncBegin = (\n log: LogMethods,\n methodName: string,\n formattedArgs: string,\n promiseId: number,\n combinedMeta: CallMetadata,\n) => {\n log.info(\n `.${formatFunction(methodName)} ↴ (${formattedArgs}) ${chalk.gray('=>')} ${formatPromise(promiseId)}`,\n {},\n combinedMeta,\n );\n};\n\nconst logAsyncResolved = (\n log: LogMethods,\n methodName: string,\n resolvedValue: unknown | undefined,\n promiseId: number,\n startTime: number,\n combinedMeta: CallMetadata,\n) => {\n if (resolvedValue !== undefined) {\n log.info(\n `.${formatFunction(methodName)} ↲ ${greenCheck} ${chalk.gray('resolve')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray('=>')} ${inspect(\n resolvedValue,\n false,\n 1,\n true,\n )}`,\n {},\n combinedMeta,\n );\n } else {\n log.info(\n `.${formatFunction(methodName)} ↲ ${greenCheck} ${chalk.gray('resolve')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)}`,\n {},\n combinedMeta,\n );\n }\n};\n\nconst logAsyncRejected = (\n log: LogMethods,\n methodName: string,\n err: Error,\n promiseId: number,\n startTime: number,\n combinedMeta: CallMetadata,\n) => {\n log.info(\n `.${formatFunction(methodName)} ↲ 🔥 ${chalk.gray('reject')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray('=>')} ${err}`,\n {},\n combinedMeta,\n );\n};\n\nconst greenCheck = chalk.green('✔');\n\nconst formatTimeElapsed = (startTime: number) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);\n\nconst COLOR_FUNCTION = [220, 220, 170] as const;\n\nconst formatFunction = (name: string) => chalk.bold(chalk.rgb(...COLOR_FUNCTION)(name));\n\nconst formatPromise = (id: number) => chalk.blue(`Promise#${id}`);\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { type LogConfig, type LogFilter, LogLevel, type LogOptions, LogProcessorType, levels } from './config';\nimport { type LogProcessor } from './context';\nimport { loadOptions } from './platform';\nimport { CONSOLE_PROCESSOR, DEBUG_PROCESSOR, BROWSER_PROCESSOR } from './processors';\n\n/**\n * Processor variants.\n */\nexport const processors: { [index: string]: LogProcessor } = {\n [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,\n [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,\n [LogProcessorType.DEBUG]: DEBUG_PROCESSOR,\n};\n\nconst IS_BROWSER = typeof window !== 'undefined' || typeof navigator !== 'undefined';\n\nexport const DEFAULT_PROCESSORS = [IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR];\n\nexport const parseFilter = (filter: string | string[] | LogLevel): LogFilter[] => {\n if (typeof filter === 'number') {\n return [{ level: filter }];\n }\n\n const parseLogLevel = (level: string, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;\n\n const lines = typeof filter === 'string' ? filter.split(/,\\s*/) : filter;\n return lines.map((filter) => {\n const [pattern, level] = filter.split(':');\n return level ? { level: parseLogLevel(level), pattern } : { level: parseLogLevel(pattern) };\n });\n};\n\nexport const getConfig = (options?: LogOptions): LogConfig => {\n const nodeOptions: LogOptions | undefined =\n 'process' in globalThis\n ? {\n file: process!.env.LOG_CONFIG,\n filter: process!.env.LOG_FILTER,\n processor: process!.env.LOG_PROCESSOR,\n }\n : undefined;\n\n const mergedOptions: LogOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);\n return {\n options: mergedOptions,\n filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),\n captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),\n processors: mergedOptions.processor ? [processors[mergedOptions.processor]] : DEFAULT_PROCESSORS,\n prefix: mergedOptions.prefix,\n };\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport fs from 'node:fs';\n\nimport { type LogOptions } from '../../config';\n\n/**\n * Node config loader.\n */\nexport const loadOptions = (filepath?: string): LogOptions | undefined => {\n if (filepath) {\n // console.log(`Log file: ${fullpath}`);\n try {\n const text = fs.readFileSync(filepath, 'utf-8');\n if (text) {\n return yaml.load(text) as LogOptions;\n }\n } catch (err) {\n console.warn(`Invalid log file: ${filepath}`);\n }\n }\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport chalk from 'chalk';\nimport pickBy from 'lodash.pickby';\nimport { inspect } from 'node:util';\n\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport { type LogConfig, LogLevel, shortLevelName } from '../config';\nimport { getContextFromEntry, type LogProcessor, shouldLog } from '../context';\n\nconst LEVEL_COLORS: Record<LogLevel, typeof chalk.ForegroundColor> = {\n [LogLevel.TRACE]: 'gray',\n [LogLevel.DEBUG]: 'gray',\n [LogLevel.INFO]: 'white',\n [LogLevel.WARN]: 'yellow',\n [LogLevel.ERROR]: 'red',\n};\n\nexport const truncate = (text?: string, length = 0, right = false) => {\n const str = text && length ? (right ? text.slice(-length) : text.substring(0, length)) : text ?? '';\n return right ? str.padStart(length, ' ') : str.padEnd(length, ' ');\n};\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n\n// TODO(burdon): Optional package name.\n// TODO(burdon): Show exceptions on one line.\nexport type FormatParts = {\n path?: string;\n line?: number;\n timestamp?: string;\n level: LogLevel;\n message: string;\n context?: any;\n error?: Error;\n scope?: any;\n};\n\nexport type Formatter = (config: LogConfig, parts: FormatParts) => (string | undefined)[];\n\nexport const DEFAULT_FORMATTER: Formatter = (\n config,\n { path, line, level, message, context, error, scope },\n): string[] => {\n const column = config.options?.formatter?.column;\n const filepath = path !== undefined && line !== undefined ? chalk.grey(`${path}:${line}`) : undefined;\n\n let instance;\n if (scope) {\n const prototype = Object.getPrototypeOf(scope);\n const id = getPrototypeSpecificInstanceId(scope);\n instance = chalk.magentaBright(`${prototype.constructor.name}#${id}`);\n }\n\n const formattedTimestamp = config.options?.formatter?.timestamp ? new Date().toISOString() : undefined;\n const formattedLevel = chalk[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);\n const padding = column && filepath ? ''.padStart(column - filepath.length) : undefined;\n\n return config.options?.formatter?.timestampFirst\n ? [formattedTimestamp, filepath, padding, formattedLevel, instance, message, context, error]\n : [\n // NOTE: File path must come fist for console hyperlinks.\n // Must not truncate for terminal output.\n filepath,\n padding,\n formattedTimestamp,\n formattedLevel,\n instance,\n message,\n context,\n error,\n ];\n};\n\nexport const SHORT_FORMATTER: Formatter = (config, { path, level, message }) => {\n return [\n chalk.grey(truncate(path, 16, true)), // NOTE: Breaks terminal linking.\n chalk[LEVEL_COLORS[level]](shortLevelName[level]),\n message,\n ];\n};\n\n// TODO(burdon): Config option.\nconst formatter = DEFAULT_FORMATTER;\n\nexport const CONSOLE_PROCESSOR: LogProcessor = (config, entry) => {\n const { level, message, meta, error } = entry;\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n const parts: FormatParts = {\n level,\n message,\n error,\n path: undefined,\n line: undefined,\n scope: undefined,\n context: undefined,\n };\n\n if (meta) {\n parts.path = getRelativeFilename(meta.F);\n parts.line = meta.L;\n parts.scope = meta.S;\n }\n\n const context = getContextFromEntry(entry);\n if (context) {\n // Remove undefined fields.\n // https://nodejs.org/api/util.html#utilinspectobject-options\n parts.context = inspect(\n pickBy(context, (value?: unknown) => value !== undefined),\n { depth: config.options.depth, colors: true, maxArrayLength: 8, sorted: false },\n );\n }\n\n const line = formatter(config, parts).filter(Boolean).join(' ');\n console.log(line);\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport { type LogProcessor } from '../context';\n\nexport const DEBUG_PROCESSOR: LogProcessor = (config, entry) => {\n console.log(inspect(entry, false, null, true));\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { getDebugName, safariCheck } from '@dxos/util';\n\nimport { LogLevel } from '../config';\nimport { getContextFromEntry, type LogProcessor, shouldLog } from '../context';\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n\ntype Config = {\n useTestProcessor: boolean;\n printFileLinks: boolean;\n};\n\nconst CONFIG: Config =\n typeof mochaExecutor !== 'undefined'\n ? {\n useTestProcessor: true,\n printFileLinks: true,\n }\n : {\n useTestProcessor: false,\n printFileLinks: false,\n };\n\n/**\n * For running apps in the browser normally.\n */\nconst APP_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n // Example local editor prefix: 'vscode://file/Users/burdon/Code/dxos/dxos/'.\n const LOG_BROWSER_PREFIX = config.prefix ?? 'https://vscode.dev/github.com/dxos/dxos/blob/main/';\n\n // TODO(burdon): CSS breaks formatting (e.g., [Object] rather than expandable property).\n // TODO(burdon): Consider custom formatters.\n // https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html\n // NOTE: Cannot change color of link (from bright white).\n // const LOG_BROWSER_CSS = ['color:gray; font-size:10px; padding-bottom: 4px', 'color:#B97852; font-size:14px;'];\n const LOG_BROWSER_CSS: string[] = [];\n\n let link = '';\n if (entry.meta) {\n const filename = getRelativeFilename(entry.meta.F);\n const filepath = `${LOG_BROWSER_PREFIX.replace(/\\/$/, '')}/${filename}`;\n // TODO(burdon): Line numbers not working for app link, even with colons.\n // https://stackoverflow.com/a/54459820/2804332\n link = `${filepath}#L${entry.meta.L}`;\n }\n\n let args = [];\n\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n const scopeName = scope.name || getDebugName(scope);\n const processPrefix = entry.meta.S?.hostSessionId ? '[worker] ' : '';\n // TODO(dmaretskyi): Those can be made clickable with a custom formatter.\n args.push(`%c${processPrefix}${scopeName}`, 'color:#C026D3;font-weight:bold');\n }\n\n args.push(entry.message);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n // Safari prints source code location as this file, not the caller.\n if (CONFIG.printFileLinks || safariCheck()) {\n if (LOG_BROWSER_CSS?.length) {\n args = [`%c${link}\\n%c${args.join(' ')}`, ...LOG_BROWSER_CSS];\n } else {\n args = [link + '\\n', ...args];\n }\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\n/**\n * For running unit tests in the headless browser.\n */\nconst TEST_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n let path = '';\n if (entry.meta) {\n path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;\n }\n\n let args = [];\n\n const processPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n args.push(`${processPrefix}${entry.message}`);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n if (CONFIG.printFileLinks) {\n args = [path, ...args];\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\nexport const BROWSER_PROCESSOR: LogProcessor = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { appendFileSync, mkdirSync, openSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { jsonify } from '@dxos/util';\n\nimport { type LogFilter, LogLevel } from '../config';\nimport { type LogProcessor, getContextFromEntry, shouldLog } from '../context';\n\n// Amount of time to retry writing after encountering EAGAIN before giving up.\nconst EAGAIN_MAX_DURATION = 1000;\n/**\n * Create a file processor.\n * @param path - Path to log file to create or append to, or existing open file descriptor e.g. stdout.\n * @param levels - Log levels to process. Takes preference over Filters.\n * @param filters - Filters to apply.\n */\nexport const createFileProcessor = ({\n pathOrFd,\n levels,\n filters,\n}: {\n pathOrFd: string | number;\n levels: LogLevel[];\n filters?: LogFilter[];\n}): LogProcessor => {\n let fd: number | undefined;\n\n return (config, entry) => {\n if (levels.length > 0 && !levels.includes(entry.level)) {\n return;\n }\n if (!shouldLog(entry, filters)) {\n return;\n }\n if (typeof pathOrFd === 'number') {\n fd = pathOrFd;\n } else {\n try {\n mkdirSync(dirname(pathOrFd));\n } catch {}\n fd = openSync(pathOrFd, 'w');\n }\n\n const record = {\n ...entry,\n timestamp: Date.now(),\n meta: {\n file: entry.meta?.F,\n line: entry.meta?.L,\n },\n context: jsonify(getContextFromEntry(entry)),\n };\n let retryTS: number = 0;\n\n // Retry writing if EAGAIN is encountered.\n //\n // Node may set stdout and stderr to non-blocking. https://github.com/nodejs/node/issues/42826\n // This can cause EAGAIN errors when writing to them.\n // In order to not drop logs, make log methods asynchronous, or deal with buffering/delayed writes, spin until write succeeds.\n\n while (true) {\n try {\n return appendFileSync(fd, JSON.stringify(record) + '\\n');\n } catch (err: any) {\n if (err.code !== 'EAGAIN') {\n throw err;\n }\n if (retryTS === 0) {\n retryTS = performance.now();\n } else {\n if (performance.now() - retryTS > EAGAIN_MAX_DURATION) {\n console.log(`could not write after ${EAGAIN_MAX_DURATION}ms of EAGAIN failures, giving up`);\n throw err;\n }\n }\n }\n }\n };\n};\n\nlet logFilePath: string | undefined;\nconst getLogFilePath = () => {\n logFilePath ??=\n process.env.LOG_FILE ??\n (process.env.HOME ? `${process.env.HOME}/.dxlog/${new Date().toISOString()}.log` : undefined);\n\n return logFilePath!;\n};\n\nexport const FILE_PROCESSOR: LogProcessor = createFileProcessor({\n pathOrFd: getLogFilePath(),\n levels: [LogLevel.ERROR, LogLevel.WARN, LogLevel.INFO, LogLevel.TRACE],\n});\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, LogLevel, type LogOptions } from './config';\nimport { type LogContext, type LogProcessor } from './context';\nimport { createMethodLogDecorator } from './decorators';\nimport { type CallMetadata } from './meta';\nimport { getConfig, DEFAULT_PROCESSORS } from './options';\n\n/**\n * Logging function.\n */\ntype LogFunction = (message: string, context?: LogContext, meta?: CallMetadata) => void;\n\n/**\n * Logging methods.\n */\nexport interface LogMethods {\n trace: LogFunction;\n debug: LogFunction;\n info: LogFunction;\n warn: LogFunction;\n error: LogFunction;\n catch: (error: Error | any, context?: LogContext, meta?: CallMetadata) => void;\n break: () => void;\n stack: (message?: string, context?: never, meta?: CallMetadata) => void;\n method: (arg0?: never, arg1?: never, meta?: CallMetadata) => MethodDecorator;\n}\n\n/**\n * Properties accessible on the logging function.\n */\ninterface Log extends LogMethods, LogFunction {\n config: (options: LogOptions) => void;\n addProcessor: (processor: LogProcessor) => void;\n runtimeConfig: LogConfig;\n}\n\ninterface LogImp extends Log {\n _config: LogConfig;\n}\n\nconst createLog = (): LogImp => {\n const log: LogImp = ((...params) => processLog(LogLevel.DEBUG, ...params)) as LogImp;\n\n log._config = getConfig();\n Object.defineProperty(log, 'runtimeConfig', { get: () => log._config });\n\n log.addProcessor = (processor: LogProcessor) => {\n if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {\n DEFAULT_PROCESSORS.push(processor);\n }\n if (log._config.processors.filter((p) => p === processor).length === 0) {\n log._config.processors.push(processor);\n }\n };\n\n // Set config.\n log.config = (options: LogOptions) => {\n log._config = getConfig(options);\n };\n\n // TODO(burdon): API to set context and separate error object.\n // E.g., log.warn('failed', { key: 123 }, err);\n\n log.trace = (...params) => processLog(LogLevel.TRACE, ...params);\n log.debug = (...params) => processLog(LogLevel.DEBUG, ...params);\n log.info = (...params) => processLog(LogLevel.INFO, ...params);\n log.warn = (...params) => processLog(LogLevel.WARN, ...params);\n log.error = (...params) => processLog(LogLevel.ERROR, ...params);\n\n // Catch only shows error message, not stacktrace.\n log.catch = (error: Error | any, context, meta) => processLog(LogLevel.ERROR, error.message, context, meta, error);\n\n // Show break.\n log.break = () => log.info('——————————————————————————————————————————————————');\n\n log.stack = (message, context, meta) =>\n processLog(LogLevel.INFO, `${message ?? 'Stack Dump'}\\n${getFormattedStackTrace()}`, context, meta);\n\n log.method = createMethodLogDecorator(log);\n\n /**\n * Process the current log call.\n */\n const processLog = (\n level: LogLevel,\n message: string,\n context: LogContext = {},\n meta?: CallMetadata,\n error?: Error,\n ) => {\n log._config.processors.forEach((processor) => processor(log._config, { level, message, context, meta, error }));\n };\n\n return log;\n};\n\n/**\n * Global logging function.\n */\nexport const log: Log = ((globalThis as any).dx_log ??= createLog());\n\n/**\n * Accessible from browser console.\n */\ndeclare global {\n // eslint-disable-next-line camelcase\n const dx_log: Log;\n}\n\nconst getFormattedStackTrace = () => new Error().stack!.split('\\n').slice(3).join('\\n');\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nconst kOwnershipScope = Symbol('kOwnershipScope');\nconst kCurrentOwnershipScope = Symbol('kCurrentOwnershipScope');\nconst kDebugInfoProperties = Symbol('kDebugInfoProperties');\n\n/**\n *\n */\n// TODO(burdon): Document.\nexport class OwnershipScope {\n public instance: any;\n\n constructor(\n public constr: any,\n public parent?: OwnershipScope,\n ) {}\n\n getInfo() {\n if (!this.instance) {\n return {};\n }\n const props = this.constr.prototype[kDebugInfoProperties] ?? [];\n const info: any = {};\n for (const prop of props) {\n info[prop] = this.instance[prop];\n }\n return info;\n }\n\n [inspect.custom]() {\n return {\n className: this.constr.name,\n info: this.getInfo(),\n parent: this.parent,\n };\n }\n}\n\nfunction decorateMethodWeakReturnOwnership(prototype: any, key: string) {\n const original = prototype[key];\n prototype[key] = function (...args: any) {\n const res = original.apply(this, ...args);\n\n if (res && typeof res.then === 'function') {\n res.then((value: any) => {\n if (kOwnershipScope in value) {\n value[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n });\n } else {\n if (res && kOwnershipScope in res) {\n res[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n }\n\n return res;\n };\n}\n\nexport function ownershipClass<T extends { new (...args: any[]): {} }>(constr: T) {\n for (const key of Object.getOwnPropertyNames(constr.prototype)) {\n if (key !== 'constructor' && typeof constr.prototype[key] === 'function') {\n decorateMethodWeakReturnOwnership(constr.prototype, key);\n }\n }\n\n return class extends constr {\n constructor(...args: any[]) {\n const currentCausality = (globalThis as any)[kCurrentOwnershipScope];\n (globalThis as any)[kCurrentOwnershipScope] = new OwnershipScope(constr, currentCausality);\n super(...args);\n (this as any)[kOwnershipScope] = (globalThis as any)[kCurrentOwnershipScope];\n (this as any)[kOwnershipScope].instance = this;\n (globalThis as any)[kCurrentOwnershipScope] = currentCausality;\n }\n };\n}\n\nexport const debugInfo = (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[kDebugInfoProperties] ??= []).push(propertyKey);\n};\n\nexport const getCurrentOwnershipScope = (thisRef: any) => thisRef;\n"],
5
- "mappings": "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",
6
- "names": ["import_lodash", "import_chalk", "import_node_util", "import_util", "import_node_fs", "LogLevel", "levels", "trace", "debug", "info", "warn", "error", "shortLevelName", "LogProcessorType", "logInfoProperties", "Symbol", "logInfo", "target", "propertyKey", "descriptor", "push", "gatherLogInfoFromScope", "scope", "res", "prototype", "Object", "getPrototypeOf", "infoProps", "prop", "err", "message", "matchFilter", "filter", "level", "path", "pattern", "includes", "shouldLog", "entry", "filters", "undefined", "some", "meta", "F", "getContextFromEntry", "context", "scopeInfo", "S", "keys", "length", "assign", "Error", "c", "stack", "errorContext", "nextPromiseId", "createMethodLogDecorator", "log", "arg0", "arg1", "method", "value", "methodName", "args", "combinedMeta", "formattedArgs", "map", "arg", "inspect", "join", "startTime", "performance", "now", "result", "apply", "isThenable", "id", "logAsyncBegin", "then", "resolvedValue", "logAsyncResolved", "logAsyncRejected", "logSyncCall", "logSyncError", "defineProperty", "obj", "formatFunction", "chalk", "gray", "promiseId", "formatPromise", "greenCheck", "formatTimeElapsed", "green", "toFixed", "COLOR_FUNCTION", "name", "bold", "rgb", "blue", "loadOptions", "filepath", "text", "fs", "readFileSync", "yaml", "load", "console", "LEVEL_COLORS", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "truncate", "right", "str", "slice", "substring", "padStart", "padEnd", "getRelativeFilename", "filename", "match", "filePath", "DEFAULT_FORMATTER", "config", "line", "column", "options", "formatter", "grey", "instance", "getPrototypeSpecificInstanceId", "magentaBright", "constructor", "formattedTimestamp", "timestamp", "Date", "toISOString", "formattedLevel", "padding", "timestampFirst", "SHORT_FORMATTER", "CONSOLE_PROCESSOR", "parts", "L", "pickBy", "depth", "colors", "maxArrayLength", "sorted", "Boolean", "DEBUG_PROCESSOR", "CONFIG", "mochaExecutor", "useTestProcessor", "printFileLinks", "APP_BROWSER_PROCESSOR", "LOG_BROWSER_PREFIX", "prefix", "LOG_BROWSER_CSS", "link", "replace", "scopeName", "getDebugName", "processPrefix", "hostSessionId", "safariCheck", "C", "TEST_BROWSER_PROCESSOR", "BROWSER_PROCESSOR", "EAGAIN_MAX_DURATION", "createFileProcessor", "pathOrFd", "fd", "mkdirSync", "dirname", "openSync", "record", "file", "jsonify", "retryTS", "appendFileSync", "JSON", "stringify", "code", "logFilePath", "getLogFilePath", "process", "env", "LOG_FILE", "HOME", "FILE_PROCESSOR", "processors", "CONSOLE", "BROWSER", "IS_BROWSER", "window", "navigator", "DEFAULT_PROCESSORS", "parseFilter", "parseLogLevel", "defValue", "toLowerCase", "lines", "split", "getConfig", "nodeOptions", "globalThis", "LOG_CONFIG", "LOG_FILTER", "processor", "LOG_PROCESSOR", "mergedOptions", "defaultsDeep", "captureFilters", "captureFilter", "createLog", "params", "processLog", "_config", "get", "addProcessor", "p", "catch", "break", "getFormattedStackTrace", "forEach", "dx_log", "kOwnershipScope", "kCurrentOwnershipScope", "kDebugInfoProperties", "OwnershipScope", "constr", "parent", "getInfo", "props", "custom", "className", "getCurrentOwnershipScope", "thisRef"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\n// Message helpers.\nimport omit from 'lodash.omit';\nimport pick from 'lodash.pick';\n\nexport { omit, pick };\n\nexport * from './config';\nexport * from './context';\nexport * from './log';\nexport { parseFilter } from './options';\nexport * from './processors';\nexport * from './scope';\nexport * from './meta';\n\nexport { getCurrentOwnershipScope } from './experimental/ownership';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogProcessor } from './context';\n\n/**\n * Standard levels.\n */\n// NOTE: Keep aligned with LogLevel in @dxos/protocols.\n// TODO(burdon): Update numbers?\nexport enum LogLevel {\n TRACE = 5,\n DEBUG = 10,\n INFO = 11,\n WARN = 12,\n ERROR = 13,\n}\n\nexport const levels: { [index: string]: LogLevel } = {\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n};\n\nexport const shortLevelName = {\n [LogLevel.TRACE]: 'T',\n [LogLevel.DEBUG]: 'D',\n [LogLevel.INFO]: 'I',\n [LogLevel.WARN]: 'W',\n [LogLevel.ERROR]: 'E',\n};\n\nexport enum LogProcessorType {\n CONSOLE = 'console',\n BROWSER = 'browser',\n DEBUG = 'debug',\n}\n\n/**\n * Individual filter condition.\n */\nexport type LogFilter = {\n level: LogLevel;\n pattern?: string;\n};\n\n/**\n * Options to set inline or load from the YML file.\n */\nexport type LogOptions = {\n file?: string;\n filter?: string | string[] | LogLevel;\n captureFilter?: string | string[] | LogLevel;\n depth?: number; // Context object depth.\n processor?: string | LogProcessorType;\n formatter?: {\n column: number;\n timestamp: boolean;\n timestampFirst: boolean;\n };\n prefix?: string;\n};\n\n/**\n * Runtime config.\n */\nexport interface LogConfig {\n options: LogOptions;\n filters?: LogFilter[];\n captureFilters?: LogFilter[];\n processors: LogProcessor[];\n prefix?: string;\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nconst logInfoProperties = Symbol('logInfoProperties');\n\n/**\n * Decorate fields, properties, or methods to automatically include their values in log messages.\n *\n * Example:\n *\n * ```typescript\n * class Example {\n * @logInfo\n * peerId: PublicKey;\n * }\n * ```\n */\nexport const logInfo = (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[logInfoProperties] ??= []).push(propertyKey);\n};\n\n/**\n * Introspects class instance to find decorated metadata.\n * @param scope Class instance.\n */\nexport const gatherLogInfoFromScope = (scope: any): Record<string, any> => {\n if (!scope) {\n return {};\n }\n\n const res: Record<string, any> = {};\n\n const prototype = Object.getPrototypeOf(scope);\n const infoProps = prototype[logInfoProperties] ?? [];\n for (const prop of infoProps) {\n try {\n res[prop] = typeof scope[prop] === 'function' ? scope[prop]() : scope[prop];\n } catch (err: any) {\n res[prop] = err.message;\n }\n }\n\n return res;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, type LogFilter, type LogLevel } from './config';\nimport { type CallMetadata } from './meta';\nimport { gatherLogInfoFromScope } from './scope';\n\n/**\n * Optional object passed to the logging API.\n */\nexport type LogContext = Record<string, any> | Error | any;\n\n/**\n * Record for current log line.\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n context?: LogContext;\n meta?: CallMetadata;\n error?: Error;\n}\n\n/**\n * Processes (e.g., prints, forwards) log entries.\n */\nexport type LogProcessor = (config: LogConfig, entry: LogEntry) => void;\n\nconst matchFilter = (filter: LogFilter, level: LogLevel, path: string) => {\n return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));\n};\n\n/**\n * Determines if the current line should be logged (called by the processor).\n */\nexport const shouldLog = (entry: LogEntry, filters?: LogFilter[]): boolean => {\n if (filters === undefined) {\n return true;\n } else {\n return filters.some((filter) => matchFilter(filter, entry.level, entry.meta?.F ?? ''));\n }\n};\n\nexport const getContextFromEntry = (entry: LogEntry): Record<string, any> | undefined => {\n let context;\n if (entry.meta) {\n const scopeInfo = gatherLogInfoFromScope(entry.meta.S);\n if (Object.keys(scopeInfo).length > 0) {\n context = Object.assign(context ?? {}, scopeInfo);\n }\n }\n\n if (entry.context) {\n if (entry.context instanceof Error) {\n // Additional context from Error.\n const c = (entry.context as any).context;\n // If ERROR then show stacktrace.\n context = Object.assign(context ?? {}, { error: entry.context.stack, ...c });\n } else if (typeof entry.context === 'object') {\n context = Object.assign(context ?? {}, entry.context);\n }\n }\n\n if (entry.error) {\n const errorContext = (entry.error as any).context;\n context = Object.assign(context ?? {}, { error: entry.error.stack, ...errorContext });\n }\n\n return context && Object.keys(context).length > 0 ? context : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport type { LogMethods } from './log';\nimport { type CallMetadata } from './meta';\n\nlet nextPromiseId = 0;\n\nexport const createMethodLogDecorator =\n (log: LogMethods) =>\n (arg0?: never, arg1?: never, meta?: CallMetadata): MethodDecorator =>\n (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const method = descriptor.value!;\n descriptor.value = function (this: any, ...args: any) {\n const combinedMeta = {\n ...(meta ?? {}),\n S: this as any,\n } as CallMetadata;\n\n const formattedArgs = args.map((arg: any) => inspect(arg, false, 1, true)).join(', ');\n\n try {\n const startTime = performance.now();\n const result = method.apply(this, args);\n\n if (isThenable(result)) {\n const id = nextPromiseId++;\n log.info(`${propertyKey as string}(${formattedArgs}) => Promise { #${id} }`, {}, combinedMeta);\n result.then(\n (resolvedValue) => {\n if (resolvedValue !== undefined) {\n log.info(\n `✅ resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms => ${inspect(\n resolvedValue,\n false,\n 1,\n true,\n )}`,\n {},\n combinedMeta,\n );\n } else {\n log.info(`✅ resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms`, {}, combinedMeta);\n }\n },\n (err) => {\n log.info(`🔥 reject #${id} #${(performance.now() - startTime).toFixed(0)}ms => ${err}`, {}, combinedMeta);\n },\n );\n } else {\n log.info(\n `${propertyKey as string}(${formattedArgs}) => ${inspect(result, false, 1, true)}`,\n {},\n combinedMeta,\n );\n }\n\n return result;\n } catch (err) {\n log.error(`${propertyKey as string}(${formattedArgs}) 🔥 ${err}`, {}, combinedMeta);\n throw err;\n }\n };\n Object.defineProperty(descriptor.value, 'name', { value: (propertyKey as string) + '$log' });\n };\n\nconst isThenable = (obj: any): obj is Promise<unknown> => obj && typeof obj.then === 'function';\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { type LogConfig, type LogFilter, LogLevel, type LogOptions, LogProcessorType, levels } from './config';\nimport { type LogProcessor } from './context';\nimport { loadOptions } from './platform';\nimport { CONSOLE_PROCESSOR, DEBUG_PROCESSOR, BROWSER_PROCESSOR } from './processors';\n\n/**\n * Processor variants.\n */\nexport const processors: { [index: string]: LogProcessor } = {\n [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,\n [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,\n [LogProcessorType.DEBUG]: DEBUG_PROCESSOR,\n};\n\nconst IS_BROWSER = typeof window !== 'undefined' || typeof navigator !== 'undefined';\n\nexport const DEFAULT_PROCESSORS = [IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR];\n\nexport const parseFilter = (filter: string | string[] | LogLevel): LogFilter[] => {\n if (typeof filter === 'number') {\n return [{ level: filter }];\n }\n\n const parseLogLevel = (level: string, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;\n\n const lines = typeof filter === 'string' ? filter.split(/,\\s*/) : filter;\n return lines.map((filter) => {\n const [pattern, level] = filter.split(':');\n return level ? { level: parseLogLevel(level), pattern } : { level: parseLogLevel(pattern) };\n });\n};\n\nexport const getConfig = (options?: LogOptions): LogConfig => {\n const nodeOptions: LogOptions | undefined =\n 'process' in globalThis\n ? {\n file: process!.env.LOG_CONFIG,\n filter: process!.env.LOG_FILTER,\n processor: process!.env.LOG_PROCESSOR,\n }\n : undefined;\n\n const mergedOptions: LogOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);\n return {\n options: mergedOptions,\n filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),\n captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),\n processors: mergedOptions.processor ? [processors[mergedOptions.processor]] : DEFAULT_PROCESSORS,\n prefix: mergedOptions.prefix,\n };\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport yaml from 'js-yaml';\nimport fs from 'node:fs';\n\nimport { type LogOptions } from '../../config';\n\n/**\n * Node config loader.\n */\nexport const loadOptions = (filepath?: string): LogOptions | undefined => {\n if (filepath) {\n // console.log(`Log file: ${fullpath}`);\n try {\n const text = fs.readFileSync(filepath, 'utf-8');\n if (text) {\n return yaml.load(text) as LogOptions;\n }\n } catch (err) {\n console.warn(`Invalid log file: ${filepath}`);\n }\n }\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport chalk from 'chalk';\nimport pickBy from 'lodash.pickby';\nimport { inspect } from 'node:util';\n\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport { type LogConfig, LogLevel, shortLevelName } from '../config';\nimport { getContextFromEntry, type LogProcessor, shouldLog } from '../context';\n\nconst LEVEL_COLORS: Record<LogLevel, typeof chalk.ForegroundColor> = {\n [LogLevel.TRACE]: 'gray',\n [LogLevel.DEBUG]: 'gray',\n [LogLevel.INFO]: 'white',\n [LogLevel.WARN]: 'yellow',\n [LogLevel.ERROR]: 'red',\n};\n\nexport const truncate = (text?: string, length = 0, right = false) => {\n const str = text && length ? (right ? text.slice(-length) : text.substring(0, length)) : text ?? '';\n return right ? str.padStart(length, ' ') : str.padEnd(length, ' ');\n};\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n\n// TODO(burdon): Optional package name.\n// TODO(burdon): Show exceptions on one line.\nexport type FormatParts = {\n path?: string;\n line?: number;\n timestamp?: string;\n level: LogLevel;\n message: string;\n context?: any;\n error?: Error;\n scope?: any;\n};\n\nexport type Formatter = (config: LogConfig, parts: FormatParts) => (string | undefined)[];\n\nexport const DEFAULT_FORMATTER: Formatter = (\n config,\n { path, line, timestamp, level, message, context, error, scope },\n) => {\n const column = config.options?.formatter?.column;\n\n const filepath = path !== undefined && line !== undefined ? chalk.grey(`${path}:${line}`) : undefined;\n\n let instance;\n if (scope) {\n const prototype = Object.getPrototypeOf(scope);\n const id = getPrototypeSpecificInstanceId(scope);\n instance = chalk.magentaBright(`${prototype.constructor.name}#${id}`);\n }\n\n const formattedTimestamp = config.options?.formatter?.timestamp ? new Date().toISOString() : undefined;\n const formattedLevel = chalk[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);\n const padding = column && filepath ? ''.padStart(column - filepath.length) : undefined;\n\n return config.options?.formatter?.timestampFirst\n ? [formattedTimestamp, filepath, padding, formattedLevel, instance, message, context, error]\n : [\n // NOTE: File path must come fist for console hyperlinks.\n // Must not truncate for terminal output.\n filepath,\n padding,\n formattedTimestamp,\n formattedLevel,\n instance,\n message,\n context,\n error,\n ];\n};\n\nexport const SHORT_FORMATTER: Formatter = (config, { path, level, message }) => [\n chalk.grey(truncate(path, 16, true)), // NOTE: Breaks terminal linking.\n chalk[LEVEL_COLORS[level]](shortLevelName[level]),\n message,\n];\n\n// TODO(burdon): Config option.\nconst formatter = DEFAULT_FORMATTER;\n\nexport const CONSOLE_PROCESSOR: LogProcessor = (config, entry) => {\n const { level, message, meta, error } = entry;\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n const parts: FormatParts = {\n level,\n message,\n error,\n path: undefined,\n line: undefined,\n scope: undefined,\n context: undefined,\n };\n\n if (meta) {\n parts.path = getRelativeFilename(meta.F);\n parts.line = meta.L;\n parts.scope = meta.S;\n }\n\n const context = getContextFromEntry(entry);\n if (context) {\n // Remove undefined fields.\n // https://nodejs.org/api/util.html#utilinspectobject-options\n parts.context = inspect(\n pickBy(context, (value?: unknown) => value !== undefined),\n { depth: config.options.depth, colors: true, maxArrayLength: 8, sorted: false },\n );\n }\n\n const line = formatter(config, parts).filter(Boolean).join(' ');\n console.log(line);\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nimport { type LogProcessor } from '../context';\n\nexport const DEBUG_PROCESSOR: LogProcessor = (config, entry) => {\n console.log(inspect(entry, false, null, true));\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { getDebugName, safariCheck } from '@dxos/util';\n\nimport { LogLevel } from '../config';\nimport { getContextFromEntry, type LogProcessor, shouldLog } from '../context';\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n\ntype Config = {\n useTestProcessor: boolean;\n printFileLinks: boolean;\n};\n\nconst CONFIG: Config =\n typeof mochaExecutor !== 'undefined'\n ? {\n useTestProcessor: true,\n printFileLinks: true,\n }\n : {\n useTestProcessor: false,\n printFileLinks: false,\n };\n\n/**\n * For running apps in the browser normally.\n */\nconst APP_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n // Example local editor prefix: 'vscode://file/Users/burdon/Code/dxos/dxos/'.\n const LOG_BROWSER_PREFIX = config.prefix ?? 'https://vscode.dev/github.com/dxos/dxos/blob/main/';\n\n // TODO(burdon): CSS breaks formatting (e.g., [Object] rather than expandable property).\n // TODO(burdon): Consider custom formatters.\n // https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html\n // NOTE: Cannot change color of link (from bright white).\n // const LOG_BROWSER_CSS = ['color:gray; font-size:10px; padding-bottom: 4px', 'color:#B97852; font-size:14px;'];\n const LOG_BROWSER_CSS: string[] = [];\n\n let link = '';\n if (entry.meta) {\n const filename = getRelativeFilename(entry.meta.F);\n const filepath = `${LOG_BROWSER_PREFIX.replace(/\\/$/, '')}/${filename}`;\n // TODO(burdon): Line numbers not working for app link, even with colons.\n // https://stackoverflow.com/a/54459820/2804332\n link = `${filepath}#L${entry.meta.L}`;\n }\n\n let args = [];\n\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n const scopeName = scope.name || getDebugName(scope);\n const processPrefix = entry.meta.S?.hostSessionId ? '[worker] ' : '';\n // TODO(dmaretskyi): Those can be made clickable with a custom formatter.\n args.push(`%c${processPrefix}${scopeName}`, 'color:#C026D3;font-weight:bold');\n }\n\n args.push(entry.message);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n // Safari prints source code location as this file, not the caller.\n if (CONFIG.printFileLinks || safariCheck()) {\n if (LOG_BROWSER_CSS?.length) {\n args = [`%c${link}\\n%c${args.join(' ')}`, ...LOG_BROWSER_CSS];\n } else {\n args = [link + '\\n', ...args];\n }\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\n/**\n * For running unit tests in the headless browser.\n */\nconst TEST_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {\n if (!shouldLog(entry, config.filters)) {\n return;\n }\n\n let path = '';\n if (entry.meta) {\n path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;\n }\n\n let args = [];\n\n const processPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n args.push(`${processPrefix}${entry.message}`);\n\n const context = getContextFromEntry(entry);\n if (context) {\n args.push(context);\n }\n\n const levels: any = {\n [LogLevel.ERROR]: console.error,\n [LogLevel.WARN]: console.warn,\n [LogLevel.DEBUG]: console.log,\n };\n\n if (CONFIG.printFileLinks) {\n args = [path, ...args];\n }\n\n const level = levels[entry.level] ?? console.log;\n if (typeof entry.meta?.C === 'function') {\n entry.meta.C(level, args);\n } else {\n level(...args);\n }\n};\n\nexport const BROWSER_PROCESSOR: LogProcessor = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { appendFileSync, mkdirSync, openSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { jsonify } from '@dxos/util';\n\nimport { type LogFilter, LogLevel } from '../config';\nimport { type LogProcessor, getContextFromEntry, shouldLog } from '../context';\n\n/**\n * Create a file processor.\n * @param path - Path to log file to create or append to, or existing open file descriptor e.g. stdout.\n * @param levels - Log levels to process. Takes preference over Filters.\n * @param filters - Filters to apply.\n */\nexport const createFileProcessor = ({\n pathOrFd,\n levels,\n filters,\n}: {\n pathOrFd: string | number;\n levels: LogLevel[];\n filters?: LogFilter[];\n}): LogProcessor => {\n let fd: number | undefined;\n\n return (config, entry) => {\n if (levels.length > 0 && !levels.includes(entry.level)) {\n return;\n }\n if (!shouldLog(entry, filters)) {\n return;\n }\n if (typeof pathOrFd === 'number') {\n fd = pathOrFd;\n } else {\n try {\n mkdirSync(dirname(pathOrFd));\n } catch {}\n fd = openSync(pathOrFd, 'w');\n }\n\n const record = {\n ...entry,\n timestamp: Date.now(),\n meta: {\n file: entry.meta?.F,\n line: entry.meta?.L,\n },\n context: jsonify(getContextFromEntry(entry)),\n };\n appendFileSync(fd, JSON.stringify(record) + '\\n');\n };\n};\n\nlet logFilePath: string | undefined;\nconst getLogFilePath = () => {\n logFilePath ??=\n process.env.LOG_FILE ??\n (process.env.HOME ? `${process.env.HOME}/.dxlog/${new Date().toISOString()}.log` : undefined);\n\n return logFilePath!;\n};\n\nexport const FILE_PROCESSOR: LogProcessor = createFileProcessor({\n pathOrFd: getLogFilePath(),\n levels: [LogLevel.ERROR, LogLevel.WARN, LogLevel.INFO, LogLevel.TRACE],\n});\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, LogLevel, type LogOptions } from './config';\nimport { type LogContext, type LogProcessor } from './context';\nimport { createMethodLogDecorator } from './decorators';\nimport { type CallMetadata } from './meta';\nimport { getConfig, DEFAULT_PROCESSORS } from './options';\n\n/**\n * Logging function.\n */\ntype LogFunction = (message: string, context?: LogContext, meta?: CallMetadata) => void;\n\n/**\n * Logging methods.\n */\nexport interface LogMethods {\n trace: LogFunction;\n debug: LogFunction;\n info: LogFunction;\n warn: LogFunction;\n error: LogFunction;\n catch: (error: Error | any, context?: LogContext, meta?: CallMetadata) => void;\n break: () => void;\n stack: (message?: string, context?: never, meta?: CallMetadata) => void;\n method: (arg0?: never, arg1?: never, meta?: CallMetadata) => MethodDecorator;\n}\n\n/**\n * Properties accessible on the logging function.\n */\ninterface Log extends LogMethods, LogFunction {\n config: (options: LogOptions) => void;\n addProcessor: (processor: LogProcessor) => void;\n runtimeConfig: LogConfig;\n}\n\ninterface LogImp extends Log {\n _config: LogConfig;\n}\n\nconst createLog = (): LogImp => {\n const log: LogImp = ((...params) => processLog(LogLevel.DEBUG, ...params)) as LogImp;\n\n log._config = getConfig();\n Object.defineProperty(log, 'runtimeConfig', { get: () => log._config });\n\n log.addProcessor = (processor: LogProcessor) => {\n if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {\n DEFAULT_PROCESSORS.push(processor);\n }\n if (log._config.processors.filter((p) => p === processor).length === 0) {\n log._config.processors.push(processor);\n }\n };\n\n // Set config.\n log.config = (options: LogOptions) => {\n log._config = getConfig(options);\n };\n\n // TODO(burdon): API to set context and separate error object.\n // E.g., log.warn('failed', { key: 123 }, err);\n\n log.trace = (...params) => processLog(LogLevel.TRACE, ...params);\n log.debug = (...params) => processLog(LogLevel.DEBUG, ...params);\n log.info = (...params) => processLog(LogLevel.INFO, ...params);\n log.warn = (...params) => processLog(LogLevel.WARN, ...params);\n log.error = (...params) => processLog(LogLevel.ERROR, ...params);\n\n // Catch only shows error message, not stacktrace.\n log.catch = (error: Error | any, context, meta) => processLog(LogLevel.ERROR, error.stack, context, meta, error);\n\n // Show break.\n log.break = () => log.info('——————————————————————————————————————————————————');\n\n log.stack = (message, context, meta) =>\n processLog(LogLevel.INFO, `${message ?? 'Stack Dump'}\\n${getFormattedStackTrace()}`, context, meta);\n\n log.method = createMethodLogDecorator(log);\n\n /**\n * Process the current log call.\n */\n const processLog = (\n level: LogLevel,\n message: string,\n context: LogContext = {},\n meta?: CallMetadata,\n error?: Error,\n ) => {\n log._config.processors.forEach((processor) => processor(log._config, { level, message, context, meta, error }));\n };\n\n return log;\n};\n\n/**\n * Global logging function.\n */\nexport const log: Log = ((globalThis as any).dx_log ??= createLog());\n\n/**\n * Accessible from browser console.\n */\ndeclare global {\n // eslint-disable-next-line camelcase\n const dx_log: Log;\n}\n\nconst getFormattedStackTrace = () => new Error().stack!.split('\\n').slice(3).join('\\n');\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { inspect } from 'node:util';\n\nconst kOwnershipScope = Symbol('kOwnershipScope');\nconst kCurrentOwnershipScope = Symbol('kCurrentOwnershipScope');\nconst kDebugInfoProperties = Symbol('kDebugInfoProperties');\n\n/**\n *\n */\n// TODO(burdon): Document.\nexport class OwnershipScope {\n public instance: any;\n\n constructor(\n public constr: any,\n public parent?: OwnershipScope,\n ) {}\n\n getInfo() {\n if (!this.instance) {\n return {};\n }\n const props = this.constr.prototype[kDebugInfoProperties] ?? [];\n const info: any = {};\n for (const prop of props) {\n info[prop] = this.instance[prop];\n }\n return info;\n }\n\n [inspect.custom]() {\n return {\n className: this.constr.name,\n info: this.getInfo(),\n parent: this.parent,\n };\n }\n}\n\nfunction decorateMethodWeakReturnOwnership(prototype: any, key: string) {\n const original = prototype[key];\n prototype[key] = function (...args: any) {\n const res = original.apply(this, ...args);\n\n if (res && typeof res.then === 'function') {\n res.then((value: any) => {\n if (kOwnershipScope in value) {\n value[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n });\n } else {\n if (res && kOwnershipScope in res) {\n res[kOwnershipScope].parent ??= this[kOwnershipScope];\n }\n }\n\n return res;\n };\n}\n\nexport function ownershipClass<T extends { new (...args: any[]): {} }>(constr: T) {\n for (const key of Object.getOwnPropertyNames(constr.prototype)) {\n if (key !== 'constructor' && typeof constr.prototype[key] === 'function') {\n decorateMethodWeakReturnOwnership(constr.prototype, key);\n }\n }\n\n return class extends constr {\n constructor(...args: any[]) {\n const currentCausality = (globalThis as any)[kCurrentOwnershipScope];\n (globalThis as any)[kCurrentOwnershipScope] = new OwnershipScope(constr, currentCausality);\n super(...args);\n (this as any)[kOwnershipScope] = (globalThis as any)[kCurrentOwnershipScope];\n (this as any)[kOwnershipScope].instance = this;\n (globalThis as any)[kCurrentOwnershipScope] = currentCausality;\n }\n };\n}\n\nexport const debugInfo = (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[kDebugInfoProperties] ??= []).push(propertyKey);\n};\n\nexport const getCurrentOwnershipScope = (thisRef: any) => thisRef;\n"],
5
+ "mappings": "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",
6
+ "names": ["import_lodash", "import_node_util", "import_util", "import_node_fs", "LogLevel", "levels", "trace", "debug", "info", "warn", "error", "shortLevelName", "LogProcessorType", "logInfoProperties", "Symbol", "logInfo", "target", "propertyKey", "descriptor", "push", "gatherLogInfoFromScope", "scope", "res", "prototype", "Object", "getPrototypeOf", "infoProps", "prop", "err", "message", "matchFilter", "filter", "level", "path", "pattern", "includes", "shouldLog", "entry", "filters", "undefined", "some", "meta", "F", "getContextFromEntry", "context", "scopeInfo", "S", "keys", "length", "assign", "Error", "c", "stack", "errorContext", "nextPromiseId", "createMethodLogDecorator", "log", "arg0", "arg1", "method", "value", "args", "combinedMeta", "formattedArgs", "map", "arg", "inspect", "join", "startTime", "performance", "now", "result", "apply", "isThenable", "id", "then", "resolvedValue", "toFixed", "defineProperty", "obj", "loadOptions", "filepath", "text", "fs", "readFileSync", "yaml", "load", "console", "LEVEL_COLORS", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "truncate", "right", "str", "slice", "substring", "padStart", "padEnd", "getRelativeFilename", "filename", "match", "filePath", "DEFAULT_FORMATTER", "config", "line", "timestamp", "column", "options", "formatter", "chalk", "grey", "instance", "getPrototypeSpecificInstanceId", "magentaBright", "constructor", "name", "formattedTimestamp", "Date", "toISOString", "formattedLevel", "padding", "timestampFirst", "SHORT_FORMATTER", "CONSOLE_PROCESSOR", "parts", "L", "pickBy", "depth", "colors", "maxArrayLength", "sorted", "Boolean", "DEBUG_PROCESSOR", "CONFIG", "mochaExecutor", "useTestProcessor", "printFileLinks", "APP_BROWSER_PROCESSOR", "LOG_BROWSER_PREFIX", "prefix", "LOG_BROWSER_CSS", "link", "replace", "scopeName", "getDebugName", "processPrefix", "hostSessionId", "safariCheck", "C", "TEST_BROWSER_PROCESSOR", "BROWSER_PROCESSOR", "createFileProcessor", "pathOrFd", "fd", "mkdirSync", "dirname", "openSync", "record", "file", "jsonify", "appendFileSync", "JSON", "stringify", "logFilePath", "getLogFilePath", "process", "env", "LOG_FILE", "HOME", "FILE_PROCESSOR", "processors", "CONSOLE", "BROWSER", "IS_BROWSER", "window", "navigator", "DEFAULT_PROCESSORS", "parseFilter", "parseLogLevel", "defValue", "toLowerCase", "lines", "split", "getConfig", "nodeOptions", "globalThis", "LOG_CONFIG", "LOG_FILTER", "processor", "LOG_PROCESSOR", "mergedOptions", "defaultsDeep", "captureFilters", "captureFilter", "createLog", "params", "processLog", "_config", "get", "addProcessor", "p", "catch", "break", "getFormattedStackTrace", "forEach", "dx_log", "kOwnershipScope", "kCurrentOwnershipScope", "kDebugInfoProperties", "OwnershipScope", "constr", "parent", "getInfo", "props", "custom", "className", "getCurrentOwnershipScope", "thisRef"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/log/src/config.ts":{"bytes":3536,"imports":[],"format":"esm"},"packages/common/log/src/scope.ts":{"bytes":3852,"imports":[],"format":"esm"},"packages/common/log/src/context.ts":{"bytes":6618,"imports":[{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"}],"format":"esm"},"packages/common/log/src/decorators.ts":{"bytes":13956,"imports":[{"path":"chalk","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/platform/node/index.ts":{"bytes":2051,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/platform/index.ts":{"bytes":460,"imports":[{"path":"packages/common/log/src/platform/node/index.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/common/log/src/processors/console-processor.ts":{"bytes":14122,"imports":[{"path":"chalk","kind":"import-statement","external":true},{"path":"lodash.pickby","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/debug-processor.ts":{"bytes":1070,"imports":[{"path":"node:util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/processors/browser-processor.ts":{"bytes":14794,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/file-processor.ts":{"bytes":9703,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/index.ts":{"bytes":817,"imports":[{"path":"packages/common/log/src/processors/console-processor.ts","kind":"import-statement","original":"./console-processor"},{"path":"packages/common/log/src/processors/debug-processor.ts","kind":"import-statement","original":"./debug-processor"},{"path":"packages/common/log/src/processors/browser-processor.ts","kind":"import-statement","original":"./browser-processor"},{"path":"packages/common/log/src/processors/file-processor.ts","kind":"import-statement","original":"./file-processor"}],"format":"esm"},"packages/common/log/src/options.ts":{"bytes":7558,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/platform/index.ts","kind":"import-statement","original":"./platform"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"}],"format":"esm"},"packages/common/log/src/log.ts":{"bytes":10313,"imports":[{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/decorators.ts","kind":"import-statement","original":"./decorators"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"}],"format":"esm"},"packages/common/log/src/meta.ts":{"bytes":1625,"imports":[],"format":"esm"},"packages/common/log/src/experimental/ownership.ts":{"bytes":9286,"imports":[{"path":"node:util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/index.ts":{"bytes":1663,"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"./context"},{"path":"packages/common/log/src/log.ts","kind":"import-statement","original":"./log"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"},{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"},{"path":"packages/common/log/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/common/log/src/experimental/ownership.ts","kind":"import-statement","original":"./experimental/ownership"}],"format":"esm"}},"outputs":{"packages/common/log/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":49225},"packages/common/log/dist/lib/node/index.cjs":{"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"chalk","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"chalk","kind":"import-statement","external":true},{"path":"lodash.pickby","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true}],"exports":["BROWSER_PROCESSOR","CONSOLE_PROCESSOR","DEBUG_PROCESSOR","DEFAULT_FORMATTER","FILE_PROCESSOR","LogLevel","LogProcessorType","SHORT_FORMATTER","createFileProcessor","gatherLogInfoFromScope","getContextFromEntry","getCurrentOwnershipScope","levels","log","logInfo","omit","parseFilter","pick","shortLevelName","shouldLog","truncate"],"entryPoint":"packages/common/log/src/index.ts","inputs":{"packages/common/log/src/index.ts":{"bytesInOutput":64},"packages/common/log/src/config.ts":{"bytesInOutput":703},"packages/common/log/src/scope.ts":{"bytesInOutput":571},"packages/common/log/src/context.ts":{"bytesInOutput":1153},"packages/common/log/src/decorators.ts":{"bytesInOutput":3138},"packages/common/log/src/options.ts":{"bytesInOutput":1542},"packages/common/log/src/platform/node/index.ts":{"bytesInOutput":315},"packages/common/log/src/platform/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/console-processor.ts":{"bytesInOutput":2922},"packages/common/log/src/processors/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/debug-processor.ts":{"bytesInOutput":146},"packages/common/log/src/processors/browser-processor.ts":{"bytesInOutput":2762},"packages/common/log/src/processors/file-processor.ts":{"bytesInOutput":1742},"packages/common/log/src/log.ts":{"bytesInOutput":1930},"packages/common/log/src/experimental/ownership.ts":{"bytesInOutput":782}},"bytes":18814}}}
1
+ {"inputs":{"packages/common/log/src/config.ts":{"bytes":3536,"imports":[],"format":"esm"},"packages/common/log/src/scope.ts":{"bytes":3852,"imports":[],"format":"esm"},"packages/common/log/src/context.ts":{"bytes":6644,"imports":[{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"}],"format":"esm"},"packages/common/log/src/decorators.ts":{"bytes":8231,"imports":[{"path":"node:util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/platform/node/index.ts":{"bytes":2051,"imports":[{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/platform/index.ts":{"bytes":460,"imports":[{"path":"packages/common/log/src/platform/node/index.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/common/log/src/processors/console-processor.ts":{"bytes":14089,"imports":[{"path":"chalk","kind":"import-statement","external":true},{"path":"lodash.pickby","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/debug-processor.ts":{"bytes":1070,"imports":[{"path":"node:util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/processors/browser-processor.ts":{"bytes":14799,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/file-processor.ts":{"bytes":6675,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"../config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"packages/common/log/src/processors/index.ts":{"bytes":817,"imports":[{"path":"packages/common/log/src/processors/console-processor.ts","kind":"import-statement","original":"./console-processor"},{"path":"packages/common/log/src/processors/debug-processor.ts","kind":"import-statement","original":"./debug-processor"},{"path":"packages/common/log/src/processors/browser-processor.ts","kind":"import-statement","original":"./browser-processor"},{"path":"packages/common/log/src/processors/file-processor.ts","kind":"import-statement","original":"./file-processor"}],"format":"esm"},"packages/common/log/src/options.ts":{"bytes":7558,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/platform/index.ts","kind":"import-statement","original":"./platform"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"}],"format":"esm"},"packages/common/log/src/log.ts":{"bytes":10311,"imports":[{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/decorators.ts","kind":"import-statement","original":"./decorators"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"}],"format":"esm"},"packages/common/log/src/meta.ts":{"bytes":1625,"imports":[],"format":"esm"},"packages/common/log/src/experimental/ownership.ts":{"bytes":9286,"imports":[{"path":"node:util","kind":"import-statement","external":true}],"format":"esm"},"packages/common/log/src/index.ts":{"bytes":1663,"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"packages/common/log/src/config.ts","kind":"import-statement","original":"./config"},{"path":"packages/common/log/src/context.ts","kind":"import-statement","original":"./context"},{"path":"packages/common/log/src/log.ts","kind":"import-statement","original":"./log"},{"path":"packages/common/log/src/options.ts","kind":"import-statement","original":"./options"},{"path":"packages/common/log/src/processors/index.ts","kind":"import-statement","original":"./processors"},{"path":"packages/common/log/src/scope.ts","kind":"import-statement","original":"./scope"},{"path":"packages/common/log/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/common/log/src/experimental/ownership.ts","kind":"import-statement","original":"./experimental/ownership"}],"format":"esm"}},"outputs":{"packages/common/log/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44511},"packages/common/log/dist/lib/node/index.cjs":{"imports":[{"path":"lodash.omit","kind":"import-statement","external":true},{"path":"lodash.pick","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"js-yaml","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"chalk","kind":"import-statement","external":true},{"path":"lodash.pickby","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"node:util","kind":"import-statement","external":true}],"exports":["BROWSER_PROCESSOR","CONSOLE_PROCESSOR","DEBUG_PROCESSOR","DEFAULT_FORMATTER","FILE_PROCESSOR","LogLevel","LogProcessorType","SHORT_FORMATTER","createFileProcessor","gatherLogInfoFromScope","getContextFromEntry","getCurrentOwnershipScope","levels","log","logInfo","omit","parseFilter","pick","shortLevelName","shouldLog","truncate"],"entryPoint":"packages/common/log/src/index.ts","inputs":{"packages/common/log/src/index.ts":{"bytesInOutput":64},"packages/common/log/src/config.ts":{"bytesInOutput":703},"packages/common/log/src/scope.ts":{"bytesInOutput":571},"packages/common/log/src/context.ts":{"bytesInOutput":1159},"packages/common/log/src/decorators.ts":{"bytesInOutput":1652},"packages/common/log/src/options.ts":{"bytesInOutput":1542},"packages/common/log/src/platform/node/index.ts":{"bytesInOutput":315},"packages/common/log/src/platform/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/console-processor.ts":{"bytesInOutput":2905},"packages/common/log/src/processors/index.ts":{"bytesInOutput":0},"packages/common/log/src/processors/debug-processor.ts":{"bytesInOutput":146},"packages/common/log/src/processors/browser-processor.ts":{"bytesInOutput":2762},"packages/common/log/src/processors/file-processor.ts":{"bytesInOutput":1242},"packages/common/log/src/log.ts":{"bytesInOutput":1928},"packages/common/log/src/experimental/ownership.ts":{"bytesInOutput":782}},"bytes":16815}}}
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../../src/decorators.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAI3C,eAAO,MAAM,wBAAwB,QAC7B,UAAU,aACR,KAAK,SAAS,KAAK,SAAS,YAAY,KAAG,eAsClD,CAAC"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../../src/decorators.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAI3C,eAAO,MAAM,wBAAwB,QAC7B,UAAU,aACR,KAAK,SAAS,KAAK,SAAS,YAAY,KAAG,eAsDlD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"console-processor.d.ts","sourceRoot":"","sources":["../../../../src/processors/console-processor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAkB,MAAM,WAAW,CAAC;AACrE,OAAO,EAAuB,KAAK,YAAY,EAAa,MAAM,YAAY,CAAC;AAU/E,eAAO,MAAM,QAAQ,UAAW,MAAM,6CAGrC,CAAC;AAgBF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;AAE1F,eAAO,MAAM,iBAAiB,EAAE,SAgC/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,SAM7B,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,YAkC/B,CAAC"}
1
+ {"version":3,"file":"console-processor.d.ts","sourceRoot":"","sources":["../../../../src/processors/console-processor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAkB,MAAM,WAAW,CAAC;AACrE,OAAO,EAAuB,KAAK,YAAY,EAAa,MAAM,YAAY,CAAC;AAU/E,eAAO,MAAM,QAAQ,UAAW,MAAM,6CAGrC,CAAC;AAgBF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;AAE1F,eAAO,MAAM,iBAAiB,EAAE,SAiC/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,SAI7B,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,YAkC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-processor.d.ts","sourceRoot":"","sources":["../../../../src/processors/file-processor.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,KAAK,YAAY,EAAkC,MAAM,YAAY,CAAC;AAI/E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;cAKpB,MAAM,GAAG,MAAM;YACjB,QAAQ,EAAE;;MAEhB,YAsDH,CAAC;AAWF,eAAO,MAAM,cAAc,EAAE,YAG3B,CAAC"}
1
+ {"version":3,"file":"file-processor.d.ts","sourceRoot":"","sources":["../../../../src/processors/file-processor.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,KAAK,YAAY,EAAkC,MAAM,YAAY,CAAC;AAE/E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;cAKpB,MAAM,GAAG,MAAM;YACjB,QAAQ,EAAE;;MAEhB,YA8BH,CAAC;AAWF,eAAO,MAAM,cAAc,EAAE,YAG3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/log",
3
- "version": "0.4.10-main.181e72f",
3
+ "version": "0.4.10-main.1a9d28b",
4
4
  "description": "Logger",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -24,8 +24,8 @@
24
24
  "lodash.omit": "^4.5.0",
25
25
  "lodash.pick": "^4.4.0",
26
26
  "lodash.pickby": "^4.6.0",
27
- "@dxos/node-std": "0.4.10-main.181e72f",
28
- "@dxos/util": "0.4.10-main.181e72f"
27
+ "@dxos/node-std": "0.4.10-main.1a9d28b",
28
+ "@dxos/util": "0.4.10-main.1a9d28b"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@swc-node/sourcemap-support": "^0.2.0",
package/src/context.ts CHANGED
@@ -64,7 +64,7 @@ export const getContextFromEntry = (entry: LogEntry): Record<string, any> | unde
64
64
 
65
65
  if (entry.error) {
66
66
  const errorContext = (entry.error as any).context;
67
- context = Object.assign(context ?? {}, { error: entry.error, ...errorContext });
67
+ context = Object.assign(context ?? {}, { error: entry.error.stack, ...errorContext });
68
68
  }
69
69
 
70
70
  return context && Object.keys(context).length > 0 ? context : undefined;
package/src/decorators.ts CHANGED
@@ -2,7 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import chalk from 'chalk';
6
5
  import { inspect } from 'node:util';
7
6
 
8
7
  import type { LogMethods } from './log';
@@ -15,7 +14,6 @@ export const createMethodLogDecorator =
15
14
  (arg0?: never, arg1?: never, meta?: CallMetadata): MethodDecorator =>
16
15
  (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
17
16
  const method = descriptor.value!;
18
- const methodName = propertyKey as string;
19
17
  descriptor.value = function (this: any, ...args: any) {
20
18
  const combinedMeta = {
21
19
  ...(meta ?? {}),
@@ -30,117 +28,43 @@ export const createMethodLogDecorator =
30
28
 
31
29
  if (isThenable(result)) {
32
30
  const id = nextPromiseId++;
33
- logAsyncBegin(log, methodName, formattedArgs, id, combinedMeta);
31
+ log.info(`${propertyKey as string}(${formattedArgs}) => Promise { #${id} }`, {}, combinedMeta);
34
32
  result.then(
35
33
  (resolvedValue) => {
36
- logAsyncResolved(log, methodName, resolvedValue, id, startTime, combinedMeta);
34
+ if (resolvedValue !== undefined) {
35
+ log.info(
36
+ `✅ resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms => ${inspect(
37
+ resolvedValue,
38
+ false,
39
+ 1,
40
+ true,
41
+ )}`,
42
+ {},
43
+ combinedMeta,
44
+ );
45
+ } else {
46
+ log.info(`✅ resolve #${id} ${(performance.now() - startTime).toFixed(0)}ms`, {}, combinedMeta);
47
+ }
37
48
  },
38
49
  (err) => {
39
- logAsyncRejected(log, methodName, err, id, startTime, combinedMeta);
50
+ log.info(`🔥 reject #${id} #${(performance.now() - startTime).toFixed(0)}ms => ${err}`, {}, combinedMeta);
40
51
  },
41
52
  );
42
53
  } else {
43
- logSyncCall(log, methodName, formattedArgs, result, combinedMeta);
54
+ log.info(
55
+ `${propertyKey as string}(${formattedArgs}) => ${inspect(result, false, 1, true)}`,
56
+ {},
57
+ combinedMeta,
58
+ );
44
59
  }
45
60
 
46
61
  return result;
47
- } catch (err: any) {
48
- logSyncError(log, methodName, formattedArgs, err, combinedMeta);
62
+ } catch (err) {
63
+ log.error(`${propertyKey as string}(${formattedArgs}) 🔥 ${err}`, {}, combinedMeta);
49
64
  throw err;
50
65
  }
51
66
  };
52
- Object.defineProperty(descriptor.value, 'name', { value: methodName + '$log' });
67
+ Object.defineProperty(descriptor.value, 'name', { value: (propertyKey as string) + '$log' });
53
68
  };
54
69
 
55
70
  const isThenable = (obj: any): obj is Promise<unknown> => obj && typeof obj.then === 'function';
56
-
57
- const logSyncCall = (
58
- log: LogMethods,
59
- methodName: string,
60
- formattedArgs: string,
61
- result: unknown,
62
- combinedMeta: CallMetadata,
63
- ) => {
64
- log.info(
65
- `.${formatFunction(methodName)} (${formattedArgs}) ${chalk.gray('resolve')} ${inspect(result, false, 1, true)}`,
66
- {},
67
- combinedMeta,
68
- );
69
- };
70
-
71
- const logSyncError = (
72
- log: LogMethods,
73
- methodName: string,
74
- formattedArgs: string,
75
- err: Error,
76
- combinedMeta: CallMetadata,
77
- ) => {
78
- log.error(`.${formatFunction(methodName)} (${formattedArgs}) 🔥 ${err}`, {}, combinedMeta);
79
- };
80
-
81
- const logAsyncBegin = (
82
- log: LogMethods,
83
- methodName: string,
84
- formattedArgs: string,
85
- promiseId: number,
86
- combinedMeta: CallMetadata,
87
- ) => {
88
- log.info(
89
- `.${formatFunction(methodName)} ↴ (${formattedArgs}) ${chalk.gray('=>')} ${formatPromise(promiseId)}`,
90
- {},
91
- combinedMeta,
92
- );
93
- };
94
-
95
- const logAsyncResolved = (
96
- log: LogMethods,
97
- methodName: string,
98
- resolvedValue: unknown | undefined,
99
- promiseId: number,
100
- startTime: number,
101
- combinedMeta: CallMetadata,
102
- ) => {
103
- if (resolvedValue !== undefined) {
104
- log.info(
105
- `.${formatFunction(methodName)} ↲ ${greenCheck} ${chalk.gray('resolve')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray('=>')} ${inspect(
106
- resolvedValue,
107
- false,
108
- 1,
109
- true,
110
- )}`,
111
- {},
112
- combinedMeta,
113
- );
114
- } else {
115
- log.info(
116
- `.${formatFunction(methodName)} ↲ ${greenCheck} ${chalk.gray('resolve')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)}`,
117
- {},
118
- combinedMeta,
119
- );
120
- }
121
- };
122
-
123
- const logAsyncRejected = (
124
- log: LogMethods,
125
- methodName: string,
126
- err: Error,
127
- promiseId: number,
128
- startTime: number,
129
- combinedMeta: CallMetadata,
130
- ) => {
131
- log.info(
132
- `.${formatFunction(methodName)} ↲ 🔥 ${chalk.gray('reject')} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray('=>')} ${err}`,
133
- {},
134
- combinedMeta,
135
- );
136
- };
137
-
138
- const greenCheck = chalk.green('✔');
139
-
140
- const formatTimeElapsed = (startTime: number) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
141
-
142
- const COLOR_FUNCTION = [220, 220, 170] as const;
143
-
144
- const formatFunction = (name: string) => chalk.bold(chalk.rgb(...COLOR_FUNCTION)(name));
145
-
146
- const formatPromise = (id: number) => chalk.blue(`Promise#${id}`);
package/src/log.ts CHANGED
@@ -71,7 +71,7 @@ const createLog = (): LogImp => {
71
71
  log.error = (...params) => processLog(LogLevel.ERROR, ...params);
72
72
 
73
73
  // Catch only shows error message, not stacktrace.
74
- log.catch = (error: Error | any, context, meta) => processLog(LogLevel.ERROR, error.message, context, meta, error);
74
+ log.catch = (error: Error | any, context, meta) => processLog(LogLevel.ERROR, error.stack, context, meta, error);
75
75
 
76
76
  // Show break.
77
77
  log.break = () => log.info('——————————————————————————————————————————————————');
@@ -58,7 +58,7 @@ const APP_BROWSER_PROCESSOR: LogProcessor = (config, entry) => {
58
58
  const filename = getRelativeFilename(entry.meta.F);
59
59
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, '')}/${filename}`;
60
60
  // TODO(burdon): Line numbers not working for app link, even with colons.
61
- // https://stackoverflow.com/a/54459820/2804332
61
+ // https://stackoverflow.com/a/54459820/2804332
62
62
  link = `${filepath}#L${entry.meta.L}`;
63
63
  }
64
64
 
@@ -53,9 +53,10 @@ export type Formatter = (config: LogConfig, parts: FormatParts) => (string | und
53
53
 
54
54
  export const DEFAULT_FORMATTER: Formatter = (
55
55
  config,
56
- { path, line, level, message, context, error, scope },
57
- ): string[] => {
56
+ { path, line, timestamp, level, message, context, error, scope },
57
+ ) => {
58
58
  const column = config.options?.formatter?.column;
59
+
59
60
  const filepath = path !== undefined && line !== undefined ? chalk.grey(`${path}:${line}`) : undefined;
60
61
 
61
62
  let instance;
@@ -85,13 +86,11 @@ export const DEFAULT_FORMATTER: Formatter = (
85
86
  ];
86
87
  };
87
88
 
88
- export const SHORT_FORMATTER: Formatter = (config, { path, level, message }) => {
89
- return [
90
- chalk.grey(truncate(path, 16, true)), // NOTE: Breaks terminal linking.
91
- chalk[LEVEL_COLORS[level]](shortLevelName[level]),
92
- message,
93
- ];
94
- };
89
+ export const SHORT_FORMATTER: Formatter = (config, { path, level, message }) => [
90
+ chalk.grey(truncate(path, 16, true)), // NOTE: Breaks terminal linking.
91
+ chalk[LEVEL_COLORS[level]](shortLevelName[level]),
92
+ message,
93
+ ];
95
94
 
96
95
  // TODO(burdon): Config option.
97
96
  const formatter = DEFAULT_FORMATTER;
@@ -10,8 +10,6 @@ import { jsonify } from '@dxos/util';
10
10
  import { type LogFilter, LogLevel } from '../config';
11
11
  import { type LogProcessor, getContextFromEntry, shouldLog } from '../context';
12
12
 
13
- // Amount of time to retry writing after encountering EAGAIN before giving up.
14
- const EAGAIN_MAX_DURATION = 1000;
15
13
  /**
16
14
  * Create a file processor.
17
15
  * @param path - Path to log file to create or append to, or existing open file descriptor e.g. stdout.
@@ -54,31 +52,7 @@ export const createFileProcessor = ({
54
52
  },
55
53
  context: jsonify(getContextFromEntry(entry)),
56
54
  };
57
- let retryTS: number = 0;
58
-
59
- // Retry writing if EAGAIN is encountered.
60
- //
61
- // Node may set stdout and stderr to non-blocking. https://github.com/nodejs/node/issues/42826
62
- // This can cause EAGAIN errors when writing to them.
63
- // In order to not drop logs, make log methods asynchronous, or deal with buffering/delayed writes, spin until write succeeds.
64
-
65
- while (true) {
66
- try {
67
- return appendFileSync(fd, JSON.stringify(record) + '\n');
68
- } catch (err: any) {
69
- if (err.code !== 'EAGAIN') {
70
- throw err;
71
- }
72
- if (retryTS === 0) {
73
- retryTS = performance.now();
74
- } else {
75
- if (performance.now() - retryTS > EAGAIN_MAX_DURATION) {
76
- console.log(`could not write after ${EAGAIN_MAX_DURATION}ms of EAGAIN failures, giving up`);
77
- throw err;
78
- }
79
- }
80
- }
81
- }
55
+ appendFileSync(fd, JSON.stringify(record) + '\n');
82
56
  };
83
57
  };
84
58