diff --git a/packages/desktop/src/providers/StreamProvider.tsx b/packages/desktop/src/providers/StreamProvider.tsx index 35e21a6..3dbf6df 100644 --- a/packages/desktop/src/providers/StreamProvider.tsx +++ b/packages/desktop/src/providers/StreamProvider.tsx @@ -181,6 +181,33 @@ export function StreamProvider({ children }: { children: React.ReactChild }) { [updatePeerMap], ); + useEffect(() => { + let allTunedInUsers = []; + Object.values(roomsMap).map((currentLine) => { + if (currentLine.tunedInMemberIds) + allTunedInUsers = [...currentLine.tunedInMemberIds, ...allTunedInUsers]; + }); + + updatePeerMap((draft) => { + // go through peer map + // if there is someone in it who is not in a tuned in line, then destroy peer and remove + Object.entries(draft).map(([lineId, peerRelationsForLine]) => { + const usersToRemove = []; + peerRelationsForLine?.forEach((peerRelation, index) => { + if (!allTunedInUsers.includes(peerRelation.userId)) { + peerRelation.peer.destroy(); + + usersToRemove.push(peerRelation.userId); + } + }); + + draft[lineId] = draft[lineId].filter( + (peerRelation) => !usersToRemove.includes(peerRelation.userId), + ); + }); + }); + }, [roomsMap, updatePeerMap]); + const handleGotPeerRemoteStream = useCallback( (lineId: string, userId: string, remoteStream: MediaStream) => { updatePeerMap((draft) => { diff --git a/packages/desktop/src/tree/protected/terminal/line/LineDetails.tsx b/packages/desktop/src/tree/protected/terminal/line/LineDetails.tsx index 351b113..b8e6645 100644 --- a/packages/desktop/src/tree/protected/terminal/line/LineDetails.tsx +++ b/packages/desktop/src/tree/protected/terminal/line/LineDetails.tsx @@ -149,7 +149,7 @@ export default function LineDetails() { return peerMap[lineId].map( (linePeer) => - linePeer.peerMediaStream && ( + linePeer?.peerMediaStream && (