76 lines
2.4 KiB
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)
|
|
|
|
// Коллбек для обработки удаления комнаты
|
|
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"}},
|
|
},
|
|
}
|
|
}
|