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 {} } }