From fb7ade04494d8a94dd08b2edd1b8d461e7867d07 Mon Sep 17 00:00:00 2001 From: RMO Date: Thu, 28 Aug 2025 03:42:01 -0600 Subject: [PATCH] docs: add logging helpers --- .../app/studio/src/errors/ErrorHandler.ts | 3 ++ packages/app/studio/src/errors/ErrorInfo.ts | 4 +++ packages/app/studio/src/errors/ErrorLog.ts | 7 ++++- packages/app/studio/src/errors/LogBuffer.ts | 6 ++++ .../app/studio/src/service/SyncLogService.ts | 6 ++++ packages/docs/docs-dev/debugging/logging.md | 30 +++++++++++++++++++ packages/docs/docs-dev/debugging/overview.md | 1 + packages/docs/docs-user/troubleshooting.md | 6 ++++ packages/lib/runtime/src/stopwatch.ts | 1 + packages/lib/runtime/src/timespan.ts | 1 + packages/lib/std/src/warning.ts | 6 ++++ .../studio/core/src/sync-log/SyncLogWriter.ts | 13 +++++++- 12 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 packages/docs/docs-dev/debugging/logging.md diff --git a/packages/app/studio/src/errors/ErrorHandler.ts b/packages/app/studio/src/errors/ErrorHandler.ts index d8d3aaabf..02f9cae1f 100644 --- a/packages/app/studio/src/errors/ErrorHandler.ts +++ b/packages/app/studio/src/errors/ErrorHandler.ts @@ -16,9 +16,11 @@ import { showErrorDialog, showInfoDialog } from "@/ui/components/dialogs.tsx"; * facing dialog. */ export class ErrorHandler { + /** Collects listeners that need to be disposed when the handler stops. */ readonly terminator = new Terminator(); readonly #service: StudioService; + /** Guard to avoid infinite error loops once an error has been processed. */ #errorThrown: boolean = false; constructor(service: StudioService) { @@ -87,6 +89,7 @@ export class ErrorHandler { * * @param owner - Window or worker to attach listeners to. * @param scope - Descriptive name of the owner for reporting. + * @returns Terminable that removes the listeners. */ install( owner: WindowProxy | Worker | AudioWorkletNode, diff --git a/packages/app/studio/src/errors/ErrorInfo.ts b/packages/app/studio/src/errors/ErrorInfo.ts index 9cdcdaf09..677b14319 100644 --- a/packages/app/studio/src/errors/ErrorInfo.ts +++ b/packages/app/studio/src/errors/ErrorInfo.ts @@ -5,8 +5,11 @@ import { isDefined } from "@opendaw/lib-std"; /** Normalized representation of diverse error events. */ export type ErrorInfo = { + /** Name of the error type. */ name: string; + /** Optional human-readable error message. */ message?: string; + /** Raw stack trace if available. */ stack?: string; }; @@ -28,6 +31,7 @@ export namespace ErrorInfo { if (reason instanceof Error) { if (!isDefined(reason.stack)) { try { + // Re-throwing captures a stack when one isn't present. // noinspection ExceptionCaughtLocallyJS throw reason; } catch (error) { diff --git a/packages/app/studio/src/errors/ErrorLog.ts b/packages/app/studio/src/errors/ErrorLog.ts index 7243d04af..762332c4b 100644 --- a/packages/app/studio/src/errors/ErrorLog.ts +++ b/packages/app/studio/src/errors/ErrorLog.ts @@ -14,7 +14,12 @@ export type ErrorLog = { agent: string; /** Build information for the running application. */ build: BuildInfo; - /** Number of script tags present on the page. */ + /** + * Number of `