Files
g365sfu/boot/boot.go

77 lines
2.3 KiB
Go

package boot
import (
"encoding/json"
"g365sfu/bytebuffer"
"g365sfu/logger"
"g365sfu/sfu"
"g365sfu/socket"
"net/http"
"os"
"github.com/joho/godotenv"
"github.com/pion/webrtc/v4"
)
func Bootstrap() {
godotenv.Load()
sfu.InitWebRTCEngines()
if os.Getenv("SECRET") == "" {
logger.LogErrorMessage("server failed to start because not set secret key in .env variables")
return
}
http.HandleFunc("/", socket.HandleWebSocket)
port := os.Getenv("PORT")
if port == "" {
port = "1001"
}
sfu.OnLocalICECandidate = OnLocalICECandidate
sfu.OnServerOffer = OnServerOffer
logger.LogInfoMessage("server started at x.x.x.x:" + port)
http.ListenAndServe(":"+port, nil)
}
// Коллбек для обработки новых ICE кандидатов от сервера к пиру
func OnLocalICECandidate(roomID string, peerID string, candidate webrtc.ICECandidateInit) {
room, exists := sfu.GetRoom(roomID)
if !exists {
logger.LogWarnMessage("tried to send local ICE candidate to non existing room " + roomID)
return
}
jsonCandidate, _ := json.Marshal(candidate)
buffer := bytebuffer.Allocate(
1 + 4 + len([]byte(roomID)) + 4 + len([]byte(peerID)) + 4 + len(jsonCandidate),
)
buffer.Put(0x04)
buffer.PutUint32(uint32(len([]byte(roomID))))
buffer.PutBytes([]byte(roomID))
buffer.PutUint32(uint32(len([]byte(peerID))))
buffer.PutBytes([]byte(peerID))
buffer.PutUint32(uint32(len([]byte(jsonCandidate))))
buffer.PutBytes([]byte(jsonCandidate))
buffer.Flip()
room.Server.WriteBinary(buffer.Bytes())
}
// Обработка нового оффера от сервера для конкретного пира (при renegotiation)
func OnServerOffer(roomID string, peerID string, offer webrtc.SessionDescription) {
room, exists := sfu.GetRoom(roomID)
if !exists {
logger.LogWarnMessage("tried to send server offer to non existing room " + roomID)
return
}
jsonOffer, _ := json.Marshal(offer)
buffer := bytebuffer.Allocate(
1 + 4 + len([]byte(roomID)) + 4 + len([]byte(peerID)) + 4 + len(jsonOffer),
)
buffer.Put(0x08)
buffer.PutUint32(uint32(len([]byte(roomID))))
buffer.PutBytes([]byte(roomID))
buffer.PutUint32(uint32(len([]byte(peerID))))
buffer.PutBytes([]byte(peerID))
buffer.PutUint32(uint32(len([]byte(jsonOffer))))
buffer.PutBytes([]byte(jsonOffer))
buffer.Flip()
room.Server.WriteBinary(buffer.Bytes())
}