From 432ebadd447b2ed4300a99e5fdd3555516ea68bc Mon Sep 17 00:00:00 2001 From: "Timo K." Date: Tue, 13 Oct 2026 12:59:15 +0200 Subject: [PATCH] Key media tiles by the membership id The bumped js-sdk reports the legacy identity as rtcBackendIdentity for every membership, so a device that rejoins after an improper leave, which has two memberships until the stale one expires, produced two tiles with the same key and crashed the call view. The membership id tells them apart; the audio renderer keys by it too. --- src/state/CallViewModel/CallViewModel.ts | 6 +++++- src/tracks/MemberAudioRenderer.tsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/state/CallViewModel/CallViewModel.ts b/src/state/CallViewModel/CallViewModel.ts index 5bb71d6fc..62bf1507c 100644 --- a/src/state/CallViewModel/CallViewModel.ts +++ b/src/state/CallViewModel/CallViewModel.ts @@ -658,9 +658,13 @@ export function createCallViewModel$( function* ([members, duplicateTiles]) { for (const member of members) { const mediaId = `${member.userId}:${member.deviceId}`; + // A device that rejoins after an improper leave has two + // memberships until the stale one expires, so the key is the + // membership's own id, which the backend identity no longer + // tells apart for (let dup = 0; dup < 1 + duplicateTiles; dup++) { yield { - keys: [dup, mediaId, member.rtcBackendIdentity], + keys: [dup, mediaId, member.memberId], data: member, }; } diff --git a/src/tracks/MemberAudioRenderer.tsx b/src/tracks/MemberAudioRenderer.tsx index dd9beb14b..e18f6fef7 100644 --- a/src/tracks/MemberAudioRenderer.tsx +++ b/src/tracks/MemberAudioRenderer.tsx @@ -100,7 +100,7 @@ export const MemberAudioRenderer: FC = ({
{members.map((member) => (