From b013285408fdd6160166ab5a969baff223fbd727 Mon Sep 17 00:00:00 2001 From: Smile Rex Date: Mon, 26 Jan 2026 19:54:25 +0300 Subject: [PATCH] fix --- main.go | 2 +- peer.go | 11 +++-------- room.go | 33 ++++++++++++++++++++++++++++----- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/main.go b/main.go index 451cf23..71ee543 100644 --- a/main.go +++ b/main.go @@ -20,7 +20,7 @@ func wsHandler(w http.ResponseWriter, r *http.Request) { } peer := NewPeer(conn, room) - room.Add(peer) + room.AddPeer(peer) go peer.ReadLoop() } diff --git a/peer.go b/peer.go index a23591c..5784f34 100644 --- a/peer.go +++ b/peer.go @@ -63,13 +63,8 @@ func NewPeer(conn *websocket.Conn, room *Room) *Peer { pc.OnTrack(func(remote *webrtc.TrackRemote, _ *webrtc.RTPReceiver) { local := NewTrack(remote) - p.Room.mu.Lock() - for _, other := range p.Room.peers { - if other.ID != p.ID { - other.AddTrack(local) - } - } - p.Room.mu.Unlock() + // 🔥 регистрируем трек в комнате + p.Room.AddTrack(p, local) for { pkt, _, err := remote.ReadRTP() @@ -95,7 +90,7 @@ func (p *Peer) AddTrack(track *Track) { func (p *Peer) ReadLoop() { defer func() { p.Conn.Close() - p.Room.Remove(p.ID) + p.Room.RemovePeer(p.ID) p.PC.Close() }() diff --git a/room.go b/room.go index 14a5668..8e2dac5 100644 --- a/room.go +++ b/room.go @@ -3,24 +3,47 @@ package main import "sync" type Room struct { - mu sync.Mutex - peers map[string]*Peer + mu sync.Mutex + peers map[string]*Peer + tracks []*Track } func NewRoom() *Room { return &Room{ - peers: make(map[string]*Peer), + peers: make(map[string]*Peer), + tracks: make([]*Track, 0), } } -func (r *Room) Add(p *Peer) { +func (r *Room) AddPeer(p *Peer) { r.mu.Lock() defer r.mu.Unlock() + r.peers[p.ID] = p + + // 🔥 ВАЖНО: отдать новому peer ВСЕ существующие треки + for _, track := range r.tracks { + p.AddTrack(track) + } } -func (r *Room) Remove(id string) { +func (r *Room) RemovePeer(id string) { r.mu.Lock() defer r.mu.Unlock() delete(r.peers, id) } + +func (r *Room) AddTrack(from *Peer, track *Track) { + r.mu.Lock() + defer r.mu.Unlock() + + // сохраняем трек + r.tracks = append(r.tracks, track) + + // форвардим всем, кроме источника + for _, peer := range r.peers { + if peer.ID != from.ID { + peer.AddTrack(track) + } + } +}