Merge pull request #3733 from element-hq/valere/bug_fix_stringify_crash
Fix: crash on mobile (android) with `0.17.0-rc.2` due to a log causing stringify to crash with `TypedError: circular structure`
This commit is contained in:
34
src/settings/rageshake.test.ts
Normal file
34
src/settings/rageshake.test.ts
Normal file
@@ -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();
|
||||||
|
});
|
||||||
@@ -75,7 +75,14 @@ class ConsoleLogger extends EventEmitter {
|
|||||||
} else if (arg instanceof Error) {
|
} else if (arg instanceof Error) {
|
||||||
return arg.message + (arg.stack ? `\n${arg.stack}` : "");
|
return arg.message + (arg.stack ? `\n${arg.stack}` : "");
|
||||||
} else if (typeof arg === "object") {
|
} 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 {
|
} else {
|
||||||
return arg;
|
return arg;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1555,7 +1555,15 @@ export function createCallViewModel$(
|
|||||||
matrixLivekitMembers$.pipe(
|
matrixLivekitMembers$.pipe(
|
||||||
map((members) => members.value),
|
map((members) => members.value),
|
||||||
tap((v) => {
|
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}]`,
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user