78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
package main
|
||
|
||
import (
|
||
"crypto/tls"
|
||
"log"
|
||
"log/slog"
|
||
"net/http"
|
||
|
||
"github.com/okdaichi/gomoqt/moqt"
|
||
"github.com/okdaichi/gomoqt/quic"
|
||
)
|
||
|
||
func main() {
|
||
// 🔐 Загружаем mkcert сертификат
|
||
cert, err := tls.LoadX509KeyPair("localhost+3.pem", "localhost+3-key.pem")
|
||
if err != nil {
|
||
log.Fatalf("failed to load server cert and key: %v", err)
|
||
}
|
||
|
||
tlsConfig := &tls.Config{
|
||
Certificates: []tls.Certificate{cert},
|
||
NextProtos: []string{"h3"}, // обязательно для HTTP/3
|
||
}
|
||
|
||
// 🚀 MoQ сервер
|
||
server := moqt.Server{
|
||
Addr: ":8080",
|
||
TLSConfig: tlsConfig,
|
||
QUICConfig: &quic.Config{
|
||
Allow0RTT: true,
|
||
EnableDatagrams: true,
|
||
},
|
||
}
|
||
|
||
path := "/relay"
|
||
|
||
// 🌐 WebTransport endpoint
|
||
http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
|
||
slog.Info("Incoming WebTransport request")
|
||
|
||
err := server.HandleWebTransport(w, r)
|
||
if err != nil {
|
||
slog.Error("WebTransport error", "error", err)
|
||
}
|
||
})
|
||
|
||
// 📡 MoQ setup handler
|
||
moqt.HandleFunc(path, func(w moqt.SetupResponseWriter, r *moqt.SetupRequest) {
|
||
slog.Info("MoQ setup request received")
|
||
|
||
sess, err := moqt.Accept(w, r, nil)
|
||
if err != nil {
|
||
slog.Error("Failed to accept session", "error", err)
|
||
return
|
||
}
|
||
|
||
slog.Info("MoQ session established", "remote", sess.RemoteAddr())
|
||
|
||
// ⚠️ НЕ блокируем поток!
|
||
go handleSession(sess)
|
||
})
|
||
|
||
slog.Info("Server starting on https://localhost:8080")
|
||
|
||
if err := server.ListenAndServe(); err != nil {
|
||
slog.Error("Server failed", "error", err)
|
||
}
|
||
}
|
||
|
||
func handleSession(sess *moqt.Session) {
|
||
defer sess.Context().Done()
|
||
|
||
for {
|
||
// Ждём закрытия соединения
|
||
select {}
|
||
}
|
||
}
|