bzl

self-hosted ephemeral community engine
Log | Files | Refs | README | LICENSE

commit cdb30c2657d8c3ab69fb0aa9fde56b99fc53892d
parent 9b077485e5d0c729630a3c63dbff85601bf7da1c
Author: SageAzakaela <106701693+SageAzakaela@users.noreply.github.com>
Date:   Sat, 21 Feb 2026 17:06:01 -0700

update to streaming -- allow audio during screenshare and webcam

Diffstat:
Mpublic/app.js | 49+++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+), 0 deletions(-)

diff --git a/public/app.js b/public/app.js @@ -8951,6 +8951,51 @@ async function handleStreamViewerJoinMessage(msg) { } } +async function tryGetMicrophoneTrack() { + if (!navigator.mediaDevices || typeof navigator.mediaDevices.getUserMedia !== "function") return null; + try { + const micStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false }); + const track = micStream.getAudioTracks()[0] || null; + if (!track) { + try { + for (const t of micStream.getTracks()) t.stop(); + } catch {} + return null; + } + track.addEventListener( + "ended", + () => { + try { + for (const t of micStream.getTracks()) { + if (t.id !== track.id) t.stop(); + } + } catch {} + }, + { once: true } + ); + return track; + } catch { + return null; + } +} + +async function ensureStreamAudioForKind(media, kind) { + if (!media) return media; + const audioTracks = media.getAudioTracks(); + const hasAudio = audioTracks.length > 0; + if (kind === "audio" || kind === "webcam") { + if (hasAudio) return media; + const micTrack = await tryGetMicrophoneTrack(); + if (micTrack) media.addTrack(micTrack); + return media; + } + if (kind === "screen") { + const micTrack = await tryGetMicrophoneTrack(); + if (micTrack && !hasAudio) media.addTrack(micTrack); + } + return media; +} + async function startStreamHost(post) { if (!post || !isStreamPost(post)) return; if (!streamEnabled) { @@ -8977,6 +9022,10 @@ async function startStreamHost(post) { media = await navigator.mediaDevices.getUserMedia({ audio: true, video: true }); } if (!media) throw new Error("No stream media available."); + media = await ensureStreamAudioForKind(media, kind); + if (!media.getAudioTracks().length) { + throw new Error("No audio track available. Allow microphone access to go live with sound."); + } leaveActiveStream(false); streamCurrentPostId = String(post.id || "");