From 8d5d5df8b96767ce1a4e7a1bf4cc28eb711a5ca3 Mon Sep 17 00:00:00 2001 From: set Date: Wed, 11 Mar 2026 19:32:42 +0200 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=B2=D0=B8=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20WebRTC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sfu/sfu.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 sfu/sfu.go diff --git a/sfu/sfu.go b/sfu/sfu.go new file mode 100644 index 0000000..1d85bfd --- /dev/null +++ b/sfu/sfu.go @@ -0,0 +1,64 @@ +package sfu + +import ( + "errors" + "g365sfu/logger" + "os" + + "github.com/pion/interceptor" + "github.com/pion/webrtc/v4" +) + +var ( + api *webrtc.API + pcConfig webrtc.Configuration +) + +// Коллбек для обработки новых ICE кандидатов +var OnLocalICECandidate func(roomID, peerID string, candidate webrtc.ICECandidateInit) + +// Ошибки +var ( + ErrRoomNotFound = errors.New("room not found") + ErrPeerNotFound = errors.New("peer not found") +) + +func InitWebRTCEngines() { + publicIP := os.Getenv("PUBLIC_IP") + fromPort := os.Getenv("PORT_RANGE_FROM") + toPort := os.Getenv("PORT_RANGE_TO") + if publicIP == "" || fromPort == "" || toPort == "" { + // Если не указаны необходимые переменные окружения, логируем ошибку и завершаем процесс сервера + logger.LogErrorMessage("PUBLIC_IP, PORT_RANGE_FROM and 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(40000, 50000) + + if publicIP := os.Getenv("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"}}, + }, + } +}