From 29ea90f800730d515a16b4107ccf09ca171d8650 Mon Sep 17 00:00:00 2001 From: "Timo K." Date: Mon, 10 Aug 2026 15:48:53 +0200 Subject: [PATCH] add rageshake metadata and log --- src/settings/submit-rageshake.ts | 19 +++++++++++- .../remoteMembers/ConnectionFactory.ts | 31 ++++++++++--------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/settings/submit-rageshake.ts b/src/settings/submit-rageshake.ts index 276d8e609..eaa304e72 100644 --- a/src/settings/submit-rageshake.ts +++ b/src/settings/submit-rageshake.ts @@ -19,7 +19,10 @@ import { useClient } from "../ClientContext"; import { Config } from "../config/Config"; import { type RageshakeRequestModal } from "../room/RageshakeRequestModal"; import { getUrlParams } from "../UrlParams"; - +import { deepCompare } from "matrix-js-sdk/lib/utils"; +import { advancedCamera as advancedCameraSetting } from "./settings"; +import { advancedScreenShare as advancedScreenShareSetting } from "./settings"; +import { DEFAULT_CONFIG } from "../config/ConfigOptions"; const gzip = async (text: string): Promise => { // pako is relatively large (200KB), so we only import it when needed const { gzip: pakoGzip } = await import("pako"); @@ -245,6 +248,20 @@ export function useSubmitRageshake( } } + // Add custom media related information to the rageshake issue description. + // Used to quickly identify issues due to untested configurations. + if ( + !deepCompare(Config.get().media_quality, DEFAULT_CONFIG.media_quality) + ) { + body.append("custom_media_quality_in_config", "true"); + } + if (advancedCameraSetting.getValue()) { + body.append("devTools_advancedCameraSettings", "true"); + } + if (advancedScreenShareSetting.getValue()) { + body.append("devTools_advancedScreenShareSetting", "true"); + } + if (navigator.storage && navigator.storage.estimate) { try { const estimate: { diff --git a/src/state/CallViewModel/remoteMembers/ConnectionFactory.ts b/src/state/CallViewModel/remoteMembers/ConnectionFactory.ts index 0a0bd7529..30ff37f3e 100644 --- a/src/state/CallViewModel/remoteMembers/ConnectionFactory.ts +++ b/src/state/CallViewModel/remoteMembers/ConnectionFactory.ts @@ -12,7 +12,7 @@ import { type E2EEManagerOptions, type BaseE2EEManager, } from "livekit-client"; -import { type Logger } from "matrix-js-sdk/lib/logger"; +import { logger, type Logger } from "matrix-js-sdk/lib/logger"; // imported as inline to support worker when loaded from a cdn (cross domain) import E2EEWorker from "livekit-client/e2ee-worker?worker&inline"; import { type CallMembershipIdentityParts } from "matrix-js-sdk/lib/matrixrtc/EncryptionManager"; @@ -74,20 +74,21 @@ export class ECConnectionFactory implements ConnectionFactory { private controlledAudioDevices: boolean, livekitRoomFactory?: () => LivekitRoom, ) { - const defaultFactory = (): LivekitRoom => - new LivekitRoom( - generateRoomOption({ - devices: this.devices, - processorState: this.processorState$.value, - e2eeLivekitOptions: livekitKeyProvider && { - keyProvider: livekitKeyProvider, - // It's important that every room use a separate E2EE worker. - // They get confused if given streams from multiple rooms. - worker: new E2EEWorker(), - }, - controlledAudioDevices: this.controlledAudioDevices, - }), - ); + const defaultFactory = (): LivekitRoom => { + const roomOptions = generateRoomOption({ + devices: this.devices, + processorState: this.processorState$.value, + e2eeLivekitOptions: livekitKeyProvider && { + keyProvider: livekitKeyProvider, + // It's important that every room use a separate E2EE worker. + // They get confused if given streams from multiple rooms. + worker: new E2EEWorker(), + }, + controlledAudioDevices: this.controlledAudioDevices, + }); + logger.info("[ECConnectionFactory] livekit room options: ", roomOptions); + return new LivekitRoom(roomOptions); + }; this.livekitRoomFactory = livekitRoomFactory ?? defaultFactory; }