diff --git a/lanshare/static/index.html b/lanshare/static/index.html index 60cf32a..cf21526 100644 --- a/lanshare/static/index.html +++ b/lanshare/static/index.html @@ -714,9 +714,17 @@ console.log(`[${peerId.slice(0,8)}] Received track:`, event.track.kind); const peer = state.peers.get(peerId); if (peer) { - peer.stream = event.streams[0]; + // Use the associated stream, or build one from the track + // (event.streams can be empty in some WebRTC edge cases) + if (event.streams[0]) { + peer.stream = event.streams[0]; + } else if (!peer.stream) { + peer.stream = new MediaStream([event.track]); + } else { + peer.stream.addTrack(event.track); + } updateUI(); - + // Auto-select if this is the first/only stream if (!state.selectedPeerId) { selectPeer(peerId); @@ -913,13 +921,21 @@ stopSharing(); }; - // Notify server - other peers will send request_stream in response + // Notify server send({ type: 'started_sharing', peer_id: state.peerId, has_audio: stream.getAudioTracks().length > 0, }); - + + // Proactively send offers to all connected peers so they + // receive the stream immediately. Without this, we rely on + // a request_stream round-trip that can silently fail because + // handleSignal is async but never awaited by ws.onmessage. + for (const [peerId] of state.peers) { + sendOfferTo(peerId); + } + updateUI(); } catch (err) { console.error('Error starting screen share:', err);