fix
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m35s
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m35s
This commit is contained in:
2
main.go
2
main.go
@@ -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
11
peer.go
@@ -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
27
room.go
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user