Реализация комнат с RoomID
This commit is contained in:
127
sfu/rooms.go
Normal file
127
sfu/rooms.go
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
package sfu
|
||||||
|
|
||||||
|
import (
|
||||||
|
"g365sfu/socket"
|
||||||
|
"g365sfu/utils"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/pion/webrtc/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Общие переменные
|
||||||
|
var (
|
||||||
|
rooms = make(map[string]*Room)
|
||||||
|
roomsMu sync.RWMutex
|
||||||
|
)
|
||||||
|
|
||||||
|
type Peer struct {
|
||||||
|
//Идентификатор пира, который будет использоваться для связи с ним
|
||||||
|
PeerID string
|
||||||
|
//Подсоединенный пир
|
||||||
|
PeerConnection *webrtc.PeerConnection
|
||||||
|
}
|
||||||
|
|
||||||
|
type Room struct {
|
||||||
|
//Уникальный идентификатор комнаты
|
||||||
|
RoomID string
|
||||||
|
//Сервер который создал комнату
|
||||||
|
Server []*socket.Connection
|
||||||
|
//Пиры которые подключились к комнате
|
||||||
|
Peers []Peer
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateRoom создает комнату
|
||||||
|
func CreateRoom() (*Room, error) {
|
||||||
|
roomID := "room_" + utils.RandomString(64)
|
||||||
|
roomsMu.Lock()
|
||||||
|
defer roomsMu.Unlock()
|
||||||
|
|
||||||
|
room := &Room{
|
||||||
|
RoomID: roomID,
|
||||||
|
Server: []*socket.Connection{},
|
||||||
|
Peers: []Peer{},
|
||||||
|
}
|
||||||
|
rooms[roomID] = room
|
||||||
|
|
||||||
|
return room, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRoom получает комнату по идентификатору
|
||||||
|
func GetRoom(roomID string) (*Room, bool) {
|
||||||
|
roomsMu.RLock()
|
||||||
|
defer roomsMu.RUnlock()
|
||||||
|
room, exists := rooms[roomID]
|
||||||
|
return room, exists
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteRoom удаляет комнату по идентификатору
|
||||||
|
func DeleteRoom(roomID string) {
|
||||||
|
roomsMu.Lock()
|
||||||
|
defer roomsMu.Unlock()
|
||||||
|
delete(rooms, roomID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JoinWithOffer позволяет пиру присоединиться к комнате с помощью SDP оффера
|
||||||
|
func JoinWithOffer(roomID string, peerID string, offer webrtc.SessionDescription) (*webrtc.SessionDescription, error) {
|
||||||
|
room, exists := GetRoom(roomID)
|
||||||
|
if !exists {
|
||||||
|
return nil, ErrRoomNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
peerConnection, err := api.NewPeerConnection(pcConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SFU локальные ICE-кандидаты отправляем сначала бекенду затем тот их
|
||||||
|
// пересылает клиенту для установления соединения
|
||||||
|
peerConnection.OnICECandidate(func(c *webrtc.ICECandidate) {
|
||||||
|
if c == nil {
|
||||||
|
return // gathering finished
|
||||||
|
}
|
||||||
|
if OnLocalICECandidate != nil {
|
||||||
|
OnLocalICECandidate(roomID, peerID, c.ToJSON())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
err = peerConnection.SetRemoteDescription(offer)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
answer, err := peerConnection.CreateAnswer(nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = peerConnection.SetLocalDescription(answer)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Настраиваем пересылку RTP пакетов от издателя к другим участникам комнаты
|
||||||
|
SetupForwardingForPeer(roomID, peerID, peerConnection)
|
||||||
|
|
||||||
|
room.Peers = append(room.Peers, Peer{
|
||||||
|
PeerID: peerID,
|
||||||
|
PeerConnection: peerConnection,
|
||||||
|
})
|
||||||
|
|
||||||
|
return peerConnection.LocalDescription(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddICECandidate добавляет ICE-кандидата к пиру
|
||||||
|
func AddICECandidate(roomID string, peerID string, candidate webrtc.ICECandidateInit) error {
|
||||||
|
room, exists := GetRoom(roomID)
|
||||||
|
if !exists {
|
||||||
|
return ErrRoomNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, peer := range room.Peers {
|
||||||
|
if peer.PeerID == peerID {
|
||||||
|
return peer.PeerConnection.AddICECandidate(candidate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrPeerNotFound
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user