From 5c084c9989569203bf0d61020bb0c5c5a3547bd6 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Wed, 1 Mar 2023 16:33:43 +0300 Subject: [PATCH] Fix WebRTC send candidates before send answer --- cmd/webrtc/{webrtc.go => init.go} | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) rename cmd/webrtc/{webrtc.go => init.go} (94%) diff --git a/cmd/webrtc/webrtc.go b/cmd/webrtc/init.go similarity index 94% rename from cmd/webrtc/webrtc.go rename to cmd/webrtc/init.go index 9c516f46..e49cdd8b 100644 --- a/cmd/webrtc/webrtc.go +++ b/cmd/webrtc/init.go @@ -5,6 +5,7 @@ import ( "github.com/AlexxIT/go2rtc/cmd/api" "github.com/AlexxIT/go2rtc/cmd/app" "github.com/AlexxIT/go2rtc/cmd/streams" + "github.com/AlexxIT/go2rtc/pkg/core" "github.com/AlexxIT/go2rtc/pkg/webrtc" pion "github.com/pion/webrtc/v3" "github.com/rs/zerolog" @@ -98,6 +99,8 @@ func asyncHandler(tr *api.Transport, msg *api.Message) error { return err } + var sendAnswer core.Waiter + cons := webrtc.NewConn(pc) cons.UserAgent = tr.Request.UserAgent() cons.Listen(func(msg any) { @@ -106,12 +109,17 @@ func asyncHandler(tr *api.Transport, msg *api.Message) error { if msg == pion.PeerConnectionStateClosed { stream.RemoveConsumer(cons) } + case *pion.ICECandidate: - if msg != nil { - s := msg.ToJSON().Candidate - log.Trace().Str("candidate", s).Msg("[webrtc] local") - tr.Write(&api.Message{Type: "webrtc/candidate", Value: s}) + if msg == nil { + return } + + sendAnswer.Wait() + + s := msg.ToJSON().Candidate + log.Trace().Str("candidate", s).Msg("[webrtc] local") + tr.Write(&api.Message{Type: "webrtc/candidate", Value: s}) } }) @@ -156,6 +164,8 @@ func asyncHandler(tr *api.Transport, msg *api.Message) error { tr.Write(&api.Message{Type: "webrtc/answer", Value: answer}) } + sendAnswer.Done() + asyncCandidates(tr, cons) return nil