Luxar Viewer API Documentation - v2026.9.22
    Preparing search index...

    Interface ConsoleInterceptor

    The interceptor class type, re-exported for typing the singleton proxy.

    interface ConsoleInterceptor {
        messageBuffer: BufferedMessage[];
        bufferIndex: number;
        maxBufferSize: number;
        hasWrapped: boolean;
        originalConsole: {
            log: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            warn: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            error: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            info: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            debug: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
        };
        listeners: Set<(message: BufferedMessage) => void>;
        isIntercepting: boolean;
        get isPatched(): boolean;
        patch(): void;
        extractStack(args: readonly unknown[]): string | undefined;
        captureMessage(
            type: "error" | "info" | "warn" | "log" | "debug",
            args: unknown[],
            stack?: string,
        ): void;
        getBufferedMessages(): BufferedMessage[];
        clearBuffer(): void;
        addListener(callback: (message: BufferedMessage) => void): void;
        removeListener(callback: (message: BufferedMessage) => void): void;
        getOriginalConsole(): {
            log: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            warn: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            error: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            info: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
            debug: {
                (...data: any[]): void;
                (message?: any, ...optionalParams: any[]): void;
            };
        };
        getStats(): {
            total: number;
            maxSize: number;
            types: {
                log: number;
                warn: number;
                error: number;
                info: number;
                debug: number;
            };
            oldestMessage: Date;
            newestMessage: Date;
        };
        dispose(): void;
    }
    Index
    messageBuffer: BufferedMessage[] = []

    Ring buffer for messages - automatically handles overflow

    bufferIndex: number = 0

    Current write position in ring buffer

    maxBufferSize: number = DEFAULT_MAX_BUFFER_SIZE

    Fixed maximum number of messages to buffer.

    DEFAULT_MAX_BUFFER_SIZE — the constant.

    hasWrapped: boolean = false

    Whether buffer has wrapped around

    originalConsole: {
        log: {
            (...data: any[]): void;
            (message?: any, ...optionalParams: any[]): void;
        };
        warn: {
            (...data: any[]): void;
            (message?: any, ...optionalParams: any[]): void;
        };
        error: {
            (...data: any[]): void;
            (message?: any, ...optionalParams: any[]): void;
        };
        info: {
            (...data: any[]): void;
            (message?: any, ...optionalParams: any[]): void;
        };
        debug: {
            (...data: any[]): void;
            (message?: any, ...optionalParams: any[]): void;
        };
    }

    Original console methods

    Type Declaration

    • log: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
    • warn: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
    • error: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
    • info: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
    • debug: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
    listeners: Set<(message: BufferedMessage) => void> = ...

    Callbacks for new messages

    isIntercepting: boolean = false

    Flag to ensure we only intercept once

    • Start intercepting console methods. Idempotent — safe to call repeatedly.

      After patch(), every console.log/warn/error/info/debug call also lands in the ring buffer. Reverse with dispose.

      Returns void

    • The stack of the first real Error among args, falling back to the first duck-typed stack carrier, or undefined.

      Scans ALL args rather than just the first: every log.* call formats its message into args[0] as a STRING and passes the error along behind it, so looking only at args[0] could never find one.

      Two passes so a real Error always wins over a duck-typed stack carrier: getErrorStack also accepts a plain { stack: '…' } object, so a single pass would let console.error('failed', { stack: 'context' }, realError) record the context string instead of realError.stack. The real Error is the diagnostic worth keeping. The priority pass uses isGenuineError (instance or realm-proof [[Class]] brand — so a cross-realm Error gets the same precedence as a same-realm one), NOT the wider isErrorLike: its { name, message, stack } triple fallback would let a context bag carrying all three strings shadow a real Error behind it. Duck-typed carriers belong in the fallback pass only.

      Deliberately does NOT fabricate a stack. This used to synthesize new Error().stack whenever a message merely contained the word "error", which produced a plausible-looking trace rooted inside this interceptor — worse than no stack, because someone reading the bug report would follow it.

      Parameters

      • args: readonly unknown[]

      Returns string | undefined

    • Capture a console message using ring buffer pattern

      Parameters

      • type: "error" | "info" | "warn" | "log" | "debug"
      • args: unknown[]
      • Optionalstack: string

      Returns void

    • Get original console methods

      Returns {
          log: {
              (...data: any[]): void;
              (message?: any, ...optionalParams: any[]): void;
          };
          warn: {
              (...data: any[]): void;
              (message?: any, ...optionalParams: any[]): void;
          };
          error: {
              (...data: any[]): void;
              (message?: any, ...optionalParams: any[]): void;
          };
          info: {
              (...data: any[]): void;
              (message?: any, ...optionalParams: any[]): void;
          };
          debug: {
              (...data: any[]): void;
              (message?: any, ...optionalParams: any[]): void;
          };
      }

      • log: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
      • warn: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
      • error: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
      • info: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
      • debug: { (...data: any[]): void; (message?: any, ...optionalParams: any[]): void }
    • Get buffer statistics

      Returns {
          total: number;
          maxSize: number;
          types: {
              log: number;
              warn: number;
              error: number;
              info: number;
              debug: number;
          };
          oldestMessage: Date;
          newestMessage: Date;
      }

    • Restore the original console methods and stop intercepting.

      After dispose(), captureMessage() is no longer reachable through console.log etc. The buffer is preserved (callers can still read getBufferedMessages()), and the singleton slot is left intact — call ConsoleInterceptor.disposeInstance to clear it.

      Returns void