From 1e9f2e6282f1ed86629227e847ee2856a46b7cca Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 10 Feb 2026 17:24:01 +0100 Subject: [PATCH 1/3] fix: Simplify log causing stringify `TypeError` on widget mode --- src/state/CallViewModel/CallViewModel.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/state/CallViewModel/CallViewModel.ts b/src/state/CallViewModel/CallViewModel.ts index 82bcaedb..5f7303c6 100644 --- a/src/state/CallViewModel/CallViewModel.ts +++ b/src/state/CallViewModel/CallViewModel.ts @@ -1555,7 +1555,15 @@ export function createCallViewModel$( matrixLivekitMembers$.pipe( map((members) => members.value), tap((v) => { - logger.debug("matrixLivekitMembers$ updated (exported)", v); + const listForLogs = v + .map( + (m) => + m.membership$.value.userId + "|" + m.membership$.value.deviceId, + ) + .join(","); + logger.debug( + `matrixLivekitMembers$ updated (exported) [${listForLogs}]`, + ); }), ), ), From 0d24995c3ebc038a931227259aa06a6aa206d15d Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 10 Feb 2026 17:46:58 +0100 Subject: [PATCH 2/3] add defensive coding against JSON.stringify --- src/settings/rageshake.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/settings/rageshake.ts b/src/settings/rageshake.ts index 26d0839b..c288f73e 100644 --- a/src/settings/rageshake.ts +++ b/src/settings/rageshake.ts @@ -75,7 +75,14 @@ class ConsoleLogger extends EventEmitter { } else if (arg instanceof Error) { return arg.message + (arg.stack ? `\n${arg.stack}` : ""); } else if (typeof arg === "object") { - return JSON.stringify(arg, getCircularReplacer()); + try { + return JSON.stringify(arg, getCircularReplacer()); + } catch { + // Stringify can fail if the object has circular references or if + // there is a bigInt. + // Did happen even with our `getCircularReplacer`. In this case, just log + return "<$ failed to serialize object $>"; + } } else { return arg; } From 92992df7dfaaf2556dd68231b8130f5b7d101a02 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 11 Feb 2026 13:56:42 +0100 Subject: [PATCH 3/3] test: ensure ragelogger resist to JSON.stringify throws --- src/settings/rageshake.test.ts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/settings/rageshake.test.ts diff --git a/src/settings/rageshake.test.ts b/src/settings/rageshake.test.ts new file mode 100644 index 00000000..9c3f1486 --- /dev/null +++ b/src/settings/rageshake.test.ts @@ -0,0 +1,34 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE in the repository root for full details. +*/ + +import { expect, it } from "vitest"; + +import { init as initRageshake } from "./rageshake"; + +it("Logger should not crash if JSON.stringify fails", async () => { + // JSON.stringify can throw. We want to make sure that the logger can handle this gracefully. + await initRageshake(); + + const bigIntObj = { n: 1n }; + const notStringifiable = { + bigIntObj, + }; + // @ts-expect-error - we want to create an object that cannot be stringified + notStringifiable.foo = notStringifiable; // circular reference + + // ensure this cannot be stringified + expect(() => JSON.stringify(notStringifiable)).toThrow(); + + expect(() => + global.mx_rage_logger.log( + 1, + "test", + "This is a test message", + notStringifiable, + ), + ).not.toThrow(); +});