diff --git a/extensions/matrix/src/matrix/client/logging.test.ts b/extensions/matrix/src/matrix/client/logging.test.ts index b4fb5486e04..6e827c1ed7f 100644 --- a/extensions/matrix/src/matrix/client/logging.test.ts +++ b/extensions/matrix/src/matrix/client/logging.test.ts @@ -2,7 +2,37 @@ import { logger as matrixJsSdkRootLogger } from "matrix-js-sdk/lib/logger.js"; import { describe, expect, it, vi } from "vitest"; import { ensureMatrixSdkLoggingConfigured, setMatrixSdkLogMode } from "./logging.js"; +type MatrixJsSdkTestLogger = typeof matrixJsSdkRootLogger & { + getLevel?: () => number | string; + levels: { WARN: number }; + methodFactory?: unknown; + rebuild?: () => void; + setLevel?: (level: number | string, persist?: boolean) => void; +}; + describe("Matrix SDK logging", () => { + it("restores the Matrix JS SDK global logger level after quiet mode", () => { + const logger = matrixJsSdkRootLogger as MatrixJsSdkTestLogger; + const originalLevel = logger.getLevel?.(); + const originalMethodFactory = logger.methodFactory; + try { + logger.setLevel?.("warn", false); + ensureMatrixSdkLoggingConfigured(); + setMatrixSdkLogMode("quiet"); + setMatrixSdkLogMode("default"); + + expect(logger.getLevel?.()).toBe(logger.levels.WARN); + expect(logger.methodFactory).toBe(originalMethodFactory); + } finally { + if (typeof originalLevel === "string" || typeof originalLevel === "number") { + logger.setLevel?.(originalLevel, false); + } + logger.methodFactory = originalMethodFactory; + logger.rebuild?.(); + setMatrixSdkLogMode("default"); + } + }); + it("quiets the Matrix JS SDK global logger for JSON-safe CLI commands", () => { const debugSpy = vi.spyOn(console, "debug").mockImplementation(() => undefined); try { diff --git a/extensions/matrix/src/matrix/client/logging.ts b/extensions/matrix/src/matrix/client/logging.ts index b5616589523..4cd419cbf67 100644 --- a/extensions/matrix/src/matrix/client/logging.ts +++ b/extensions/matrix/src/matrix/client/logging.ts @@ -4,9 +4,7 @@ import { ConsoleLogger, LogService, setMatrixConsoleLogging } from "../sdk/logge let matrixSdkLoggingConfigured = false; let matrixSdkLogMode: "default" | "quiet" = "default"; const matrixSdkBaseLogger = new ConsoleLogger(); -const matrixJsSdkRootLogMethodFactory = ( - matrixJsSdkRootLogger as unknown as MatrixJsSdkLoglevelLogger -).methodFactory; +let matrixJsSdkRootLoggerSnapshot: MatrixJsSdkRootLoggerSnapshot | null = null; type MatrixJsSdkLogger = { trace: (...messageOrObject: unknown[]) => void; @@ -18,9 +16,15 @@ type MatrixJsSdkLogger = { }; type MatrixJsSdkLoglevelLogger = { + getLevel?: () => number | string; methodFactory?: unknown; rebuild?: () => void; - setLevel?: (level: string, persist?: boolean) => void; + setLevel?: (level: number | string, persist?: boolean) => void; +}; + +type MatrixJsSdkRootLoggerSnapshot = { + level?: number | string; + methodFactory?: unknown; }; function shouldSuppressMatrixHttpNotFound(module: string, messageOrObject: unknown[]): boolean { @@ -88,14 +92,21 @@ function applyMatrixSdkLogger(): void { function setMatrixJsSdkRootLoggerLevel(level: "debug" | "silent"): void { const logger = matrixJsSdkRootLogger as unknown as MatrixJsSdkLoglevelLogger; + matrixJsSdkRootLoggerSnapshot ??= { + level: logger.getLevel?.(), + methodFactory: logger.methodFactory, + }; if (level === "silent") { logger.methodFactory = () => () => undefined; - logger.setLevel?.("debug", false); + logger.setLevel?.("silent", false); logger.rebuild?.(); return; } - logger.methodFactory = matrixJsSdkRootLogMethodFactory; - logger.setLevel?.("debug", false); + logger.methodFactory = matrixJsSdkRootLoggerSnapshot.methodFactory; + const previousLevel = matrixJsSdkRootLoggerSnapshot.level; + if (typeof previousLevel === "string" || typeof previousLevel === "number") { + logger.setLevel?.(previousLevel, false); + } logger.rebuild?.(); }