All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m35s
50 lines
870 B
Go
50 lines
870 B
Go
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)
|
||
}
|
||
}
|
||
}
|