From 5ebab186d85e520b91baf4e380e2c426b7c7e7ce Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 18:42:51 +0000 Subject: [PATCH] Changes Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com> --- src/lib/webrtc/broadcaster.ts | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/lib/webrtc/broadcaster.ts b/src/lib/webrtc/broadcaster.ts index 4a0fb54..d4aa4a3 100644 --- a/src/lib/webrtc/broadcaster.ts +++ b/src/lib/webrtc/broadcaster.ts @@ -97,10 +97,18 @@ export async function startBroadcast(stream: MediaStream): Promise { - t.addEventListener('ended', () => stop()); - }); + const attachEndedListeners = (s: MediaStream) => { + s.getTracks().forEach((t) => { + t.addEventListener('ended', () => { + if (s === activeStream) stop(); + }); + }); + }; + attachEndedListeners(stream); let stopped = false; const stop = async () => { @@ -113,9 +121,27 @@ export async function startBroadcast(stream: MediaStream): Promise { + const newVideo = newStream.getVideoTracks()[0]; + if (!newVideo) return; + activeStream = newStream; + attachEndedListeners(newStream); + for (const pc of peers.values()) { + const sender = pc.getSenders().find((s) => s.track && s.track.kind === 'video'); + if (sender) { + try { + await sender.replaceTrack(newVideo); + } catch (e) { + console.warn('[broadcaster] replaceTrack failed', e); + } + } + } + }; + return { code, stop, + replaceVideoTrack, onViewerCountChange: (cb) => { listeners.add(cb); cb(peers.size);