fix
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m35s

This commit is contained in:
Smile Rex
2026-01-26 19:54:25 +03:00
parent 06a6b70467
commit b013285408
3 changed files with 32 additions and 14 deletions

View File

@@ -20,7 +20,7 @@ func wsHandler(w http.ResponseWriter, r *http.Request) {
} }
peer := NewPeer(conn, room) peer := NewPeer(conn, room)
room.Add(peer) room.AddPeer(peer)
go peer.ReadLoop() go peer.ReadLoop()
} }

11
peer.go
View File

@@ -63,13 +63,8 @@ func NewPeer(conn *websocket.Conn, room *Room) *Peer {
pc.OnTrack(func(remote *webrtc.TrackRemote, _ *webrtc.RTPReceiver) { pc.OnTrack(func(remote *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
local := NewTrack(remote) local := NewTrack(remote)
p.Room.mu.Lock() // 🔥 регистрируем трек в комнате
for _, other := range p.Room.peers { p.Room.AddTrack(p, local)
if other.ID != p.ID {
other.AddTrack(local)
}
}
p.Room.mu.Unlock()
for { for {
pkt, _, err := remote.ReadRTP() pkt, _, err := remote.ReadRTP()
@@ -95,7 +90,7 @@ func (p *Peer) AddTrack(track *Track) {
func (p *Peer) ReadLoop() { func (p *Peer) ReadLoop() {
defer func() { defer func() {
p.Conn.Close() p.Conn.Close()
p.Room.Remove(p.ID) p.Room.RemovePeer(p.ID)
p.PC.Close() p.PC.Close()
}() }()

27
room.go
View File

@@ -5,22 +5,45 @@ import "sync"
type Room struct { type Room struct {
mu sync.Mutex mu sync.Mutex
peers map[string]*Peer peers map[string]*Peer
tracks []*Track
} }
func NewRoom() *Room { func NewRoom() *Room {
return &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() r.mu.Lock()
defer r.mu.Unlock() defer r.mu.Unlock()
r.peers[p.ID] = p 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() r.mu.Lock()
defer r.mu.Unlock() defer r.mu.Unlock()
delete(r.peers, id) 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)
}
}
}