generated from damir/go_app_template
87 lines
2.3 KiB
Go
87 lines
2.3 KiB
Go
package main
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
//"sync"
|
||
|
||
"github.com/pion/webrtc/v3"
|
||
)
|
||
|
||
func main() {
|
||
// Статический HTML фронтенд
|
||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||
http.ServeFile(w, r, "index.html")
|
||
})
|
||
|
||
// Сигналлинг: прием Offer и возврат Answer
|
||
http.HandleFunc("/sdp", handleSignaling)
|
||
|
||
fmt.Println("Server starting on :8080 at auth.shaiheprjct.ru")
|
||
http.ListenAndServe(":8080", nil)
|
||
}
|
||
|
||
func handleSignaling(w http.ResponseWriter, r *http.Request) {
|
||
var offer webrtc.SessionDescription
|
||
if err := json.NewDecoder(r.Body).Decode(&offer); err != nil {
|
||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||
return
|
||
}
|
||
|
||
config := webrtc.Configuration{
|
||
ICEServers: []webrtc.ICEServer{
|
||
{
|
||
URLs: []string{"stun:88.210.53.29:3478"},
|
||
},
|
||
{
|
||
URLs: []string{"turn:88.210.53.29:3478"},
|
||
Username: "shaihe",
|
||
Credential: "zaq1xsw2",
|
||
CredentialType: webrtc.ICECredentialTypePassword,
|
||
},
|
||
},
|
||
}
|
||
|
||
peerConnection, err := webrtc.NewPeerConnection(config)
|
||
if err != nil {
|
||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
return
|
||
}
|
||
|
||
// Обработка входящего DataChannel
|
||
peerConnection.OnDataChannel(func(d *webrtc.DataChannel) {
|
||
fmt.Printf("New DataChannel %s %d\n", d.Label(), d.ID())
|
||
|
||
d.OnOpen(func() {
|
||
fmt.Printf("Data channel '%s' open\n", d.Label())
|
||
})
|
||
|
||
d.OnMessage(func(msg webrtc.DataChannelMessage) {
|
||
fmt.Printf("Message from DataChannel '%s': %s\n", d.Label(), string(msg.Data))
|
||
// Эхо-ответ (имитация UDP ответа)
|
||
d.SendText("Echo: " + string(msg.Data))
|
||
})
|
||
})
|
||
|
||
// Установка удаленного описания (Offer)
|
||
err = peerConnection.SetRemoteDescription(offer)
|
||
if err != nil {
|
||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
return
|
||
}
|
||
|
||
// Создание Answer
|
||
answer, err := peerConnection.CreateAnswer(nil)
|
||
if err != nil {
|
||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
return
|
||
}
|
||
|
||
// Сбор ICE кандидатов (упрощенно: ждем завершения сбора перед отправкой Answer)
|
||
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
|
||
peerConnection.SetLocalDescription(answer)
|
||
<-gatherComplete
|
||
|
||
json.NewEncoder(w).Encode(peerConnection.LocalDescription())
|
||
} |