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

This commit is contained in:
Smile Rex
2026-01-26 19:37:37 +03:00
parent f85d36b183
commit 3630e22f20
3 changed files with 56 additions and 54 deletions

View File

@@ -19,9 +19,8 @@ func wsHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
peer := NewPeer(conn) peer := NewPeer(conn, room)
room.AddPeer(peer) room.Add(peer)
log.Println("peer added", conn.LocalAddr().String())
go peer.ReadLoop() go peer.ReadLoop()
} }
@@ -29,6 +28,6 @@ func wsHandler(w http.ResponseWriter, r *http.Request) {
func main() { func main() {
http.HandleFunc("/ws", wsHandler) http.HandleFunc("/ws", wsHandler)
log.Println("listening on :8080") log.Println("SFU listening on :8080")
log.Fatal(http.ListenAndServe(":8080", nil)) log.Fatal(http.ListenAndServe(":8080", nil))
} }

78
peer.go
View File

@@ -2,55 +2,70 @@ package main
import ( import (
"encoding/json" "encoding/json"
"log"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/pion/webrtc/v4" "github.com/pion/webrtc/v4"
) )
type Peer struct {
ID string
Conn *websocket.Conn
PC *webrtc.PeerConnection
Room *Room
Senders map[string]*webrtc.RTPSender
}
type Signal struct { type Signal struct {
Type string `json:"type"` Type string `json:"type"`
Data json.RawMessage `json:"data"` Data json.RawMessage `json:"data"`
} }
func NewPeer(conn *websocket.Conn) *Peer { type Peer struct {
pc, _ := webrtc.NewPeerConnection(webrtc.Configuration{}) ID string
Conn *websocket.Conn
PC *webrtc.PeerConnection
Room *Room
}
func NewPeer(conn *websocket.Conn, room *Room) *Peer {
pc, err := webrtc.NewPeerConnection(webrtc.Configuration{
ICEServers: []webrtc.ICEServer{
{URLs: []string{"stun:stun.l.google.com:19302"}},
},
})
if err != nil {
panic(err)
}
p := &Peer{ p := &Peer{
ID: uuid.NewString(), ID: uuid.NewString(),
Conn: conn, Conn: conn,
PC: pc, PC: pc,
Senders: make(map[string]*webrtc.RTPSender), Room: room,
} }
pc.OnTrack(func(track *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
localTrack := NewTrack(track)
p.Room.ForwardTrack(p, localTrack)
for {
pkt, _, err := track.ReadRTP()
if err != nil {
return
}
localTrack.Write(pkt)
}
})
pc.OnICECandidate(func(c *webrtc.ICECandidate) { pc.OnICECandidate(func(c *webrtc.ICECandidate) {
if c == nil { if c == nil {
return return
} }
msg, _ := json.Marshal(c.ToJSON()) data, _ := json.Marshal(c.ToJSON())
p.Send("ice", msg) p.Send("ice", data)
})
pc.OnTrack(func(remote *webrtc.TrackRemote, _ *webrtc.RTPReceiver) {
log.Println("track received", remote.Kind())
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()
for {
pkt, _, err := remote.ReadRTP()
if err != nil {
return
}
local.Write(pkt)
}
}) })
return p return p
@@ -66,7 +81,11 @@ func (p *Peer) AddTrack(track *Track) {
} }
func (p *Peer) ReadLoop() { func (p *Peer) ReadLoop() {
defer p.Conn.Close() defer func() {
p.Conn.Close()
p.Room.Remove(p.ID)
p.PC.Close()
}()
for { for {
var msg Signal var msg Signal
@@ -95,6 +114,5 @@ func (p *Peer) ReadLoop() {
} }
func (p *Peer) Send(t string, data []byte) { func (p *Peer) Send(t string, data []byte) {
msg := Signal{Type: t, Data: data} p.Conn.WriteJSON(Signal{Type: t, Data: data})
p.Conn.WriteJSON(msg)
} }

19
room.go
View File

@@ -13,29 +13,14 @@ func NewRoom() *Room {
} }
} }
func (r *Room) AddPeer(p *Peer) { func (r *Room) Add(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
p.Room = r
} }
func (r *Room) RemovePeer(id string) { func (r *Room) Remove(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) ForwardTrack(from *Peer, track *Track) {
r.mu.Lock()
defer r.mu.Unlock()
for _, peer := range r.peers {
if peer.ID == from.ID {
continue
}
peer.AddTrack(track)
}
}