implement trickle ice
This commit is contained in:
@ -266,6 +266,8 @@ func (client *SignalClient) HandleConnection(ctx context.Context, grpcClient *gr
|
||||
client.OnOffer(ctx, stream, room, msg.Sender, inner.SessionOffer.SDP)
|
||||
case *proto.SignalingMessage_SessionAnswer:
|
||||
client.OnAnswer(ctx, msg.Sender, inner.SessionAnswer.SDP)
|
||||
case *proto.SignalingMessage_ICECandidate:
|
||||
client.OnIceCandidate(ctx, msg.Sender, inner.ICECandidate.Candidate)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -298,6 +300,27 @@ func (client *SignalClient) OnDiscoverResponse(ctx context.Context, stream proto
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
|
||||
if i == nil {
|
||||
return
|
||||
}
|
||||
buffer := &bytes.Buffer{}
|
||||
if err := json.NewEncoder(buffer).Encode(i.ToJSON()); err != nil {
|
||||
return
|
||||
}
|
||||
stream.Send(&proto.SignalingMessage{
|
||||
Room: client.Room,
|
||||
Sender: client.Name,
|
||||
Receiver: &sender,
|
||||
Message: &proto.SignalingMessage_ICECandidate{
|
||||
ICECandidate: &proto.ICECandidate{
|
||||
Candidate: buffer.String(),
|
||||
Sender: client.Name,
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
dataChannel, err := peerConnection.CreateDataChannel(dataChannelName, nil)
|
||||
if err != nil {
|
||||
client.Program.Send(systemMsg(fmt.Sprint("failed to create answer: ", err)))
|
||||
@ -314,8 +337,10 @@ func (client *SignalClient) OnDiscoverResponse(ctx context.Context, stream proto
|
||||
}
|
||||
peerConnection.SetLocalDescription(sdp)
|
||||
|
||||
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
|
||||
<-gatherComplete
|
||||
if !trickleIce {
|
||||
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
|
||||
<-gatherComplete
|
||||
}
|
||||
|
||||
buffer := &bytes.Buffer{}
|
||||
if err := json.NewEncoder(buffer).Encode(peerConnection.LocalDescription()); err != nil {
|
||||
@ -347,6 +372,26 @@ func (client *SignalClient) OnOffer(ctx context.Context, stream proto.Signaling_
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
|
||||
if i == nil {
|
||||
return
|
||||
}
|
||||
buffer := &bytes.Buffer{}
|
||||
if err := json.NewEncoder(buffer).Encode(i.ToJSON()); err != nil {
|
||||
return
|
||||
}
|
||||
stream.Send(&proto.SignalingMessage{
|
||||
Room: client.Room,
|
||||
Sender: client.Name,
|
||||
Receiver: &sender,
|
||||
Message: &proto.SignalingMessage_ICECandidate{
|
||||
ICECandidate: &proto.ICECandidate{
|
||||
Candidate: buffer.String(),
|
||||
Sender: client.Name,
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
var offer webrtc.SessionDescription
|
||||
if err := json.NewDecoder(strings.NewReader(sdp)).Decode(&offer); err != nil {
|
||||
client.Program.Send(systemMsg(fmt.Sprint("Failed to decode offer for peer"+sender+": ", err)))
|
||||
@ -361,8 +406,10 @@ func (client *SignalClient) OnOffer(ctx context.Context, stream proto.Signaling_
|
||||
}
|
||||
peerConnection.SetLocalDescription(answer)
|
||||
|
||||
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
|
||||
<-gatherComplete
|
||||
if !trickleIce {
|
||||
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
|
||||
<-gatherComplete
|
||||
}
|
||||
|
||||
buffer := &bytes.Buffer{}
|
||||
if err := json.NewEncoder(buffer).Encode(peerConnection.LocalDescription()); err != nil {
|
||||
@ -400,6 +447,20 @@ func (client *SignalClient) OnAnswer(ctx context.Context, sender, sdp string) {
|
||||
|
||||
}
|
||||
|
||||
func (client SignalClient) OnIceCandidate(ctx context.Context, sender, candidate string) {
|
||||
peerConnection, ok := client.PeerConns[sender]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
candidateInit := webrtc.ICECandidateInit{}
|
||||
if err := json.NewDecoder(strings.NewReader(candidate)).Decode(&candidateInit); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
client.Program.Send(systemMsg("Client " + sender + " has offered candidate: " + candidateInit.Candidate))
|
||||
peerConnection.AddICECandidate(candidateInit)
|
||||
}
|
||||
|
||||
func (client SignalClient) GetOrCreatePeerConnection(sender string) (*webrtc.PeerConnection, error) {
|
||||
client.Lock.Lock()
|
||||
defer client.Lock.Unlock()
|
||||
@ -469,6 +530,7 @@ var (
|
||||
serverUrl string
|
||||
serverRoom string
|
||||
iceServers []string
|
||||
trickleIce bool
|
||||
|
||||
cmd = &cobra.Command{
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
@ -488,6 +550,7 @@ func main() {
|
||||
cmd.Flags().StringVar(&serverUrl, "server", "https://chat.jeffthecoder.xyz", "")
|
||||
cmd.Flags().StringVar(&serverRoom, "room", "public", "")
|
||||
cmd.Flags().StringSliceVar(&iceServers, "ice-servers", []string{"stun:nhz.jeffthecoder.xyz:3478", "stun:nhz.jeffthecoder.xyz:3479"}, "")
|
||||
cmd.Flags().BoolVar(&trickleIce, "trickle-ice", false, "")
|
||||
|
||||
cmd.Execute()
|
||||
}
|
||||
|
Reference in New Issue
Block a user