From c6ad7ac39f3d8e973db8e1cae65dba1500a94f11 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Fri, 13 Jan 2023 20:34:18 +0300 Subject: [PATCH] Add single UDP port for WebRTC Server --- cmd/debug/stack.go | 1 + cmd/webrtc/candidates.go | 33 +++++++++++++++++++-------------- pkg/webrtc/api.go | 16 ++++++++++------ pkg/webrtc/helper.go | 4 ++-- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/cmd/debug/stack.go b/cmd/debug/stack.go index cbd36647..048ed77e 100644 --- a/cmd/debug/stack.go +++ b/cmd/debug/stack.go @@ -25,6 +25,7 @@ var stackSkip = [][]byte{ // webrtc/api.go []byte("created by github.com/pion/ice/v2.NewTCPMuxDefault"), + []byte("created by github.com/pion/ice/v2.NewUDPMuxDefault"), } func stackHandler(w http.ResponseWriter, r *http.Request) { diff --git a/cmd/webrtc/candidates.go b/cmd/webrtc/candidates.go index 677c0a15..50f0c52f 100644 --- a/cmd/webrtc/candidates.go +++ b/cmd/webrtc/candidates.go @@ -7,6 +7,7 @@ import ( ) var candidates []string +var networks = []string{"udp", "tcp"} func AddCandidate(address string) { candidates = append(candidates, address) @@ -20,15 +21,17 @@ func asyncCandidates(tr *api.Transport) { continue } - cand, err := webrtc.NewCandidate(address) - if err != nil { - log.Warn().Err(err).Caller().Send() - continue + for _, network := range networks { + cand, err := webrtc.NewCandidate(network, address) + if err != nil { + log.Warn().Err(err).Caller().Send() + continue + } + + log.Trace().Str("candidate", cand).Msg("[webrtc] config") + + tr.Write(&api.Message{Type: "webrtc/candidate", Value: cand}) } - - log.Trace().Str("candidate", cand).Msg("[webrtc] config") - - tr.Write(&api.Message{Type: "webrtc/candidate", Value: cand}) } } @@ -57,13 +60,15 @@ func syncCanditates(answer string) (string, error) { continue } - cand, err := webrtc.NewCandidate(address) - if err != nil { - log.Warn().Err(err).Msg("[webrtc] candidate") - continue - } + for _, network := range networks { + cand, err := webrtc.NewCandidate(network, address) + if err != nil { + log.Warn().Err(err).Msg("[webrtc] candidate") + continue + } - md.WithPropertyAttribute(cand) + md.WithPropertyAttribute(cand) + } } if end { diff --git a/pkg/webrtc/api.go b/pkg/webrtc/api.go index 5a968045..2012d580 100644 --- a/pkg/webrtc/api.go +++ b/pkg/webrtc/api.go @@ -35,13 +35,17 @@ func NewAPI(address string) (*webrtc.API, error) { s.SetICEMulticastDNSMode(ice.MulticastDNSModeDisabled) if address != "" { - ln, err := net.Listen("tcp", address) - if err == nil { - s.SetNetworkTypes([]webrtc.NetworkType{ - webrtc.NetworkTypeUDP4, webrtc.NetworkTypeUDP6, - webrtc.NetworkTypeTCP4, webrtc.NetworkTypeTCP6, - }) + s.SetNetworkTypes([]webrtc.NetworkType{ + webrtc.NetworkTypeUDP4, webrtc.NetworkTypeUDP6, + webrtc.NetworkTypeTCP4, webrtc.NetworkTypeTCP6, + }) + if ln, err := net.ListenPacket("udp", address); err == nil { + udpMux := webrtc.NewICEUDPMux(nil, ln) + s.SetICEUDPMux(udpMux) + } + + if ln, err := net.Listen("tcp", address); err == nil { tcpMux := webrtc.NewICETCPMux(nil, ln, 8) s.SetICETCPMux(tcpMux) } diff --git a/pkg/webrtc/helper.go b/pkg/webrtc/helper.go index 8a94feab..17eaca5b 100644 --- a/pkg/webrtc/helper.go +++ b/pkg/webrtc/helper.go @@ -13,7 +13,7 @@ import ( "time" ) -func NewCandidate(address string) (string, error) { +func NewCandidate(network, address string) (string, error) { i := strings.LastIndexByte(address, ':') if i < 0 { return "", errors.New("wrong candidate: " + address) @@ -26,7 +26,7 @@ func NewCandidate(address string) (string, error) { } cand, err := ice.NewCandidateHost(&ice.CandidateHostConfig{ - Network: "tcp", + Network: network, Address: host, Port: i, Component: ice.ComponentRTP,