Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-05-14 18:42:51 +00:00
parent ed08e375ab
commit 5ebab186d8
+29 -3
View File
@@ -97,10 +97,18 @@ export async function startBroadcast(stream: MediaStream): Promise<BroadcasterHa
channel = joinSignalingChannel(code, handleMessage);
// Track the active stream so we can swap it on the fly
let activeStream: MediaStream = stream;
// Stop when the underlying stream ends
stream.getTracks().forEach((t) => {
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<BroadcasterHa
await supabase.from('share_rooms').update({ is_active: false, viewer_count: 0 }).eq('code', code);
};
const replaceVideoTrack = async (newStream: MediaStream) => {
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);