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);