Files
g365sfu/sfu/sfu.go

76 lines
2.4 KiB
Go

package sfu
import (
"errors"
"g365sfu/logger"
connection "g365sfu/socket/struct"
"g365sfu/utils"
"os"
"github.com/pion/interceptor"
"github.com/pion/webrtc/v4"
)
var (
api *webrtc.API
pcConfig webrtc.Configuration
)
// Коллбек для обработки новых SDP офферов от сервера для конкретного пира (при renegotiation)
var OnServerOffer func(roomID string, peerID string, offer webrtc.SessionDescription)
// Коллбек для обработки новых ICE кандидатов
var OnLocalICECandidate func(roomID, peerID string, candidate webrtc.ICECandidateInit)
// Коллбек для обработки отключения пира (обрыв связи)
var OnPeerDisconnected func(roomID, peerID string, server *connection.Connection, reason DisconnectReason)
// Коллбек для обработки удаления комнаты
var OnRoomDelete func(roomID string, server *connection.Connection)
// Ошибки
var (
ErrRoomNotFound = errors.New("room not found")
ErrPeerNotFound = errors.New("peer not found")
)
func InitWebRTCEngines() {
publicIP := os.Getenv("SFU_PUBLIC_IP")
fromPort := utils.AtoiOrDefault(os.Getenv("SFU_PORT_RANGE_FROM"), 30000)
toPort := utils.AtoiOrDefault(os.Getenv("SFU_PORT_RANGE_TO"), 39999)
if publicIP == "" || fromPort == 0 || toPort == 0 {
// Если не указаны необходимые переменные окружения, логируем ошибку и завершаем процесс сервера
logger.LogErrorMessage("SFU_PUBLIC_IP, SFU_PORT_RANGE_FROM and SFU_PORT_RANGE_TO environment variables must be set")
os.Exit(-1)
return
}
m := &webrtc.MediaEngine{}
_ = m.RegisterDefaultCodecs()
i := &interceptor.Registry{}
_ = webrtc.RegisterDefaultInterceptors(m, i)
se := webrtc.SettingEngine{}
_ = se.SetEphemeralUDPPortRange(uint16(fromPort), uint16(toPort))
if publicIP := os.Getenv("SFU_PUBLIC_IP"); publicIP != "" {
se.SetICEAddressRewriteRules(webrtc.ICEAddressRewriteRule{
External: []string{publicIP},
AsCandidateType: webrtc.ICECandidateTypeHost,
Mode: webrtc.ICEAddressRewriteReplace,
})
}
api = webrtc.NewAPI(
webrtc.WithMediaEngine(m),
webrtc.WithInterceptorRegistry(i),
webrtc.WithSettingEngine(se),
)
pcConfig = webrtc.Configuration{
ICEServers: []webrtc.ICEServer{
{URLs: []string{"stun:stun.l.google.com:19302"}},
},
}
}