package main import "sync" type Room struct { mu sync.Mutex peers map[string]*Peer tracks []*Track } func NewRoom() *Room { return &Room{ peers: make(map[string]*Peer), tracks: make([]*Track, 0), } } 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) 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) } } }