From 32694fddf62fd35254458d1c5f579f74153ab926 Mon Sep 17 00:00:00 2001 From: Timo K Date: Fri, 9 Jan 2026 19:04:02 +0100 Subject: [PATCH 1/5] improve rtcBackendIdentity debugging --- src/tile/GridTile.tsx | 1 + src/tile/MediaView.tsx | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/tile/GridTile.tsx b/src/tile/GridTile.tsx index 92262f05..fa2000d0 100644 --- a/src/tile/GridTile.tsx +++ b/src/tile/GridTile.tsx @@ -51,6 +51,7 @@ import { type GridTileViewModel } from "../state/TileViewModel"; import { useMergedRefs } from "../useMergedRefs"; import { useReactionsSender } from "../reactions/useReactionsSender"; import { useBehavior } from "../useBehavior"; +import { showConnectionStats } from "../settings/settings"; interface TileProps { ref?: Ref; diff --git a/src/tile/MediaView.tsx b/src/tile/MediaView.tsx index 7847a30a..02f34462 100644 --- a/src/tile/MediaView.tsx +++ b/src/tile/MediaView.tsx @@ -18,7 +18,11 @@ import styles from "./MediaView.module.css"; import { Avatar } from "../Avatar"; import { type EncryptionStatus } from "../state/MediaViewModel"; import { RaisedHandIndicator } from "../reactions/RaisedHandIndicator"; -import { showHandRaisedTimer, useSetting } from "../settings/settings"; +import { + showConnectionStats, + showHandRaisedTimer, + useSetting, +} from "../settings/settings"; import { type ReactionOption } from "../reactions"; import { ReactionIndicator } from "../reactions/ReactionIndicator"; import { RTCConnectionStats } from "../RTCConnectionStats"; @@ -81,6 +85,7 @@ export const MediaView: FC = ({ }) => { const { t } = useTranslation(); const [handRaiseTimerVisible] = useSetting(showHandRaisedTimer); + const [showConnectioStats] = useSetting(showConnectionStats); const avatarSize = Math.round(Math.min(targetWidth, targetHeight) / 2); @@ -133,7 +138,9 @@ export const MediaView: FC = ({ {waitingForMedia && (
- {t("video_tile.waiting_for_media")} + {t("video_tile.waiting_for_media") + showConnectioStats + ? " " + rtcBackendIdentity + : ""}
)} {(audioStreamStats || videoStreamStats) && ( From 7387a00406e6f32069c8f640892a424883d4ccdc Mon Sep 17 00:00:00 2001 From: Timo K Date: Fri, 9 Jan 2026 19:04:42 +0100 Subject: [PATCH 2/5] lint --- src/tile/GridTile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tile/GridTile.tsx b/src/tile/GridTile.tsx index fa2000d0..92262f05 100644 --- a/src/tile/GridTile.tsx +++ b/src/tile/GridTile.tsx @@ -51,7 +51,6 @@ import { type GridTileViewModel } from "../state/TileViewModel"; import { useMergedRefs } from "../useMergedRefs"; import { useReactionsSender } from "../reactions/useReactionsSender"; import { useBehavior } from "../useBehavior"; -import { showConnectionStats } from "../settings/settings"; interface TileProps { ref?: Ref; From 1a9e4a1a5ceebcddcc57d675772270e7e6614034 Mon Sep 17 00:00:00 2001 From: Timo K Date: Fri, 9 Jan 2026 19:12:54 +0100 Subject: [PATCH 3/5] bump js-sdk --- yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index d795f1e6..5ce82c02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11335,7 +11335,7 @@ __metadata: "matrix-js-sdk@matrix-org/matrix-js-sdk#develop": version: 39.4.0 - resolution: "matrix-js-sdk@https://github.com/matrix-org/matrix-js-sdk.git#commit=841b654c00c2a47dbd4380b4b2a6fa25156c8af0" + resolution: "matrix-js-sdk@https://github.com/matrix-org/matrix-js-sdk.git#commit=4d0d32307eb4f1ce1fb65080fcca704f5bdedc31" dependencies: "@babel/runtime": "npm:^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm": "npm:^17.0.0" @@ -11351,7 +11351,7 @@ __metadata: sdp-transform: "npm:^3.0.0" unhomoglyph: "npm:^1.0.6" uuid: "npm:13" - checksum: 10c0/532d4adb2ce95a27b4715be518d648740efddc5c88d399e127d95ff962bddd8f62f848a0ea98088672fab03b67a973d63935cd3b5ed371bb9da3131ac9472db6 + checksum: 10c0/59c9d81ccf823584dc783502cb5c928562e3490c63f5ce98ee3232a603545d6278e90dc951c1fd0bae2792ba732ec5171e03596fd396bb2150d596cebb7fbac9 languageName: node linkType: hard From 735c17d3e667c4b755f037ac470b1500342fef04 Mon Sep 17 00:00:00 2001 From: Timo K Date: Fri, 9 Jan 2026 19:31:40 +0100 Subject: [PATCH 4/5] fix tile flicker on video mute/unmute (only pass rtcBackendIdenitity instead of full rtcMember) --- src/state/CallViewModel/CallViewModel.ts | 11 +++++++---- src/state/MediaViewModel.ts | 21 +++++++++------------ src/state/ScreenShare.ts | 5 ++--- src/state/UserMedia.ts | 10 ++++------ src/utils/test.ts | 4 ++-- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/state/CallViewModel/CallViewModel.ts b/src/state/CallViewModel/CallViewModel.ts index bf5ea441..0f212101 100644 --- a/src/state/CallViewModel/CallViewModel.ts +++ b/src/state/CallViewModel/CallViewModel.ts @@ -724,6 +724,7 @@ export function createCallViewModel$( localMatrixLivekitMember; localUserMediaId = `${userId}:${membership$.value.deviceId}`; + const rtcBackendIdentity = membership$.value.rtcBackendIdentity; for (let dup = 0; dup < 1 + duplicateTiles; dup++) { yield { keys: [ @@ -732,7 +733,7 @@ export function createCallViewModel$( userId, participant satisfies TaggedParticipant as TaggedParticipant, // Widen the type safely connection$, - membership$.value, + rtcBackendIdentity, ], data: undefined, }; @@ -746,8 +747,10 @@ export function createCallViewModel$( membership$, } of matrixLivekitMembers.value) { const userMediaId = `${userId}:${membership$.value.deviceId}`; + const rtcBackendIdentity = membership$.value.rtcBackendIdentity; // skip local user as we added them manually before if (userMediaId === localUserMediaId) continue; + for (let dup = 0; dup < 1 + duplicateTiles; dup++) { yield { keys: [ @@ -756,7 +759,7 @@ export function createCallViewModel$( userId, participant, connection$, - membership$.value, + rtcBackendIdentity, ], data: undefined, }; @@ -771,7 +774,7 @@ export function createCallViewModel$( userId, participant, connection$, - membership, + rtcBackendIdentity, ) => { const livekitRoom$ = scope.behavior( connection$.pipe(map((c) => c?.livekitRoom)), @@ -789,7 +792,7 @@ export function createCallViewModel$( scope, `${userMediaId}:${dup}`, userId, - membership, + rtcBackendIdentity, participant, options.encryptionSystem, livekitRoom$, diff --git a/src/state/MediaViewModel.ts b/src/state/MediaViewModel.ts index 6b020057..3da69c46 100644 --- a/src/state/MediaViewModel.ts +++ b/src/state/MediaViewModel.ts @@ -44,7 +44,6 @@ import { throttleTime, distinctUntilChanged, } from "rxjs"; -import { type CallMembership } from "matrix-js-sdk/lib/matrixrtc"; import { alwaysShowSelf } from "../settings/settings"; import { showConnectionStats } from "../settings/settings"; @@ -258,7 +257,7 @@ abstract class BaseMediaViewModel { * The Matrix user to which this media belongs. */ public readonly userId: string, - public readonly rtcMembership: CallMembership, + public readonly rtcBackendIdentity: string, // We don't necessarily have a participant if a user connects via MatrixRTC but not (yet) through // livekit. protected readonly participant$: Observable< @@ -404,13 +403,11 @@ abstract class BaseUserMediaViewModel extends BaseMediaViewModel { */ public readonly cropVideo$: Behavior = this._cropVideo$; - public readonly rtcBackendIdentity = this.rtcMembership.rtcBackendIdentity; - public constructor( scope: ObservableScope, id: string, userId: string, - rtcMembership: CallMembership, + rtcBackendIdentity: string, participant$: Observable, encryptionSystem: EncryptionSystem, livekitRoom$: Behavior, @@ -424,7 +421,7 @@ abstract class BaseUserMediaViewModel extends BaseMediaViewModel { scope, id, userId, - rtcMembership, + rtcBackendIdentity, participant$, encryptionSystem, Track.Source.Microphone, @@ -550,7 +547,7 @@ export class LocalUserMediaViewModel extends BaseUserMediaViewModel { scope: ObservableScope, id: string, userId: string, - rtcMembership: CallMembership, + rtcBackendIdentity: string, participant$: Behavior, encryptionSystem: EncryptionSystem, livekitRoom$: Behavior, @@ -565,7 +562,7 @@ export class LocalUserMediaViewModel extends BaseUserMediaViewModel { scope, id, userId, - rtcMembership, + rtcBackendIdentity, participant$, encryptionSystem, livekitRoom$, @@ -679,7 +676,7 @@ export class RemoteUserMediaViewModel extends BaseUserMediaViewModel { scope: ObservableScope, id: string, userId: string, - rtcMembership: CallMembership, + rtcBackendIdentity: string, participant$: Observable, encryptionSystem: EncryptionSystem, livekitRoom$: Behavior, @@ -694,7 +691,7 @@ export class RemoteUserMediaViewModel extends BaseUserMediaViewModel { scope, id, userId, - rtcMembership, + rtcBackendIdentity, participant$, encryptionSystem, livekitRoom$, @@ -782,7 +779,7 @@ export class ScreenShareViewModel extends BaseMediaViewModel { scope: ObservableScope, id: string, userId: string, - rtcMembership: CallMembership, + rtcBackendIdentity: string, participant$: Observable, encryptionSystem: EncryptionSystem, livekitRoom$: Behavior, @@ -796,7 +793,7 @@ export class ScreenShareViewModel extends BaseMediaViewModel { scope, id, userId, - rtcMembership, + rtcBackendIdentity, participant$, encryptionSystem, Track.Source.ScreenShareAudio, diff --git a/src/state/ScreenShare.ts b/src/state/ScreenShare.ts index 67f97a93..e4f5de1f 100644 --- a/src/state/ScreenShare.ts +++ b/src/state/ScreenShare.ts @@ -10,7 +10,6 @@ import { type RemoteParticipant, type Room as LivekitRoom, } from "livekit-client"; -import { type CallMembership } from "matrix-js-sdk/lib/matrixrtc/CallMembership"; import { type ObservableScope } from "./ObservableScope.ts"; import { ScreenShareViewModel } from "./MediaViewModel.ts"; @@ -29,7 +28,7 @@ export class ScreenShare { private readonly scope: ObservableScope, id: string, userId: string, - rtcMember: CallMembership, + rtcBackendIdentity: string, participant: LocalParticipant | RemoteParticipant, encryptionSystem: EncryptionSystem, livekitRoom$: Behavior, @@ -42,7 +41,7 @@ export class ScreenShare { this.scope, id, userId, - rtcMember, + rtcBackendIdentity, of(participant), encryptionSystem, livekitRoom$, diff --git a/src/state/UserMedia.ts b/src/state/UserMedia.ts index 6435fb17..2a125257 100644 --- a/src/state/UserMedia.ts +++ b/src/state/UserMedia.ts @@ -13,7 +13,6 @@ import { type Room as LivekitRoom, } from "livekit-client"; import { observeParticipantEvents } from "@livekit/components-core"; -import { type CallMembership } from "matrix-js-sdk/lib/matrixrtc/CallMembership"; import { type ObservableScope } from "./ObservableScope.ts"; import { @@ -76,7 +75,7 @@ export class UserMedia { this.scope, this.id, this.userId, - this.rtcMembership, + this.rtcBackendIdentity, this.participant.value$, this.encryptionSystem, this.livekitRoom$, @@ -91,7 +90,7 @@ export class UserMedia { this.scope, this.id, this.userId, - this.rtcMembership, + this.rtcBackendIdentity, this.participant.value$, this.encryptionSystem, this.livekitRoom$, @@ -143,7 +142,7 @@ export class UserMedia { scope, `${this.id}:${key}`, this.userId, - this.rtcMembership, + this.rtcBackendIdentity, p, this.encryptionSystem, this.livekitRoom$, @@ -195,8 +194,7 @@ export class UserMedia { private readonly scope: ObservableScope, public readonly id: string, private readonly userId: string, - // TODO evaluate if this should just be the rtcBackendIdentity - private readonly rtcMembership: CallMembership, + private readonly rtcBackendIdentity: string, private readonly participant: TaggedParticipant, private readonly encryptionSystem: EncryptionSystem, private readonly livekitRoom$: Behavior, diff --git a/src/utils/test.ts b/src/utils/test.ts index 9f9ae4b7..c41743a8 100644 --- a/src/utils/test.ts +++ b/src/utils/test.ts @@ -334,7 +334,7 @@ export function createLocalMedia( testScope(), "local", member.userId, - rtcMember, + rtcMember.rtcBackendIdentity, constant(localParticipant), { kind: E2eeType.PER_PARTICIPANT, @@ -380,7 +380,7 @@ export function createRemoteMedia( testScope(), "remote", member.userId, - rtcMember, + rtcMember.rtcBackendIdentity, constant(participant), { kind: E2eeType.PER_PARTICIPANT, From 341277932c9670ca8f95a5832ccddb8daaa96910 Mon Sep 17 00:00:00 2001 From: Timo K Date: Fri, 9 Jan 2026 19:34:41 +0100 Subject: [PATCH 5/5] fix tests --- src/tile/MediaView.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/tile/MediaView.tsx b/src/tile/MediaView.tsx index 02f34462..fadc9d2b 100644 --- a/src/tile/MediaView.tsx +++ b/src/tile/MediaView.tsx @@ -138,9 +138,8 @@ export const MediaView: FC = ({ {waitingForMedia && (
- {t("video_tile.waiting_for_media") + showConnectioStats - ? " " + rtcBackendIdentity - : ""} + {t("video_tile.waiting_for_media")} + {showConnectioStats ? " " + rtcBackendIdentity : ""}
)} {(audioStreamStats || videoStreamStats) && (