1
Fork 0

Restart ICE instead of restarting down connections.

This commit is contained in:
Juliusz Chroboczek 2020-07-16 20:51:51 +02:00
parent e724194ef6
commit 9506615272
2 changed files with 28 additions and 19 deletions

View File

@ -643,7 +643,7 @@ function serverConnect() {
let m = JSON.parse(e.data); let m = JSON.parse(e.data);
switch(m.type) { switch(m.type) {
case 'offer': case 'offer':
gotOffer(m.id, m.labels, m.offer); gotOffer(m.id, m.labels, m.offer, !!m.renegotiate);
break; break;
case 'answer': case 'answer':
gotAnswer(m.id, m.answer); gotAnswer(m.id, m.answer);
@ -714,11 +714,12 @@ function sendRequest(value) {
}); });
} }
async function gotOffer(id, labels, offer) { async function gotOffer(id, labels, offer, renegotiate) {
let c = down[id]; let c = down[id];
if(c) { if(c && !renegotiate) {
// a new offer with a known id does not indicate renegotiation, // SDP is rather inflexible as to what can be renegotiated.
// but a new connection that replaces the old one. // Unless the server indicates that this is a renegotiation with
// all parameters unchanged, tear down the existing connection.
delete(down[id]) delete(down[id])
c.close(false); c.close(false);
c = null; c = null;

View File

@ -179,6 +179,7 @@ type clientMessage struct {
Offer *webrtc.SessionDescription `json:"offer,omitempty"` Offer *webrtc.SessionDescription `json:"offer,omitempty"`
Answer *webrtc.SessionDescription `json:"answer,omitempty"` Answer *webrtc.SessionDescription `json:"answer,omitempty"`
Candidate *webrtc.ICECandidateInit `json:"candidate,omitempty"` Candidate *webrtc.ICECandidateInit `json:"candidate,omitempty"`
Renegotiate bool `json:"renegotiate,omitempty"`
Labels map[string]string `json:"labels,omitempty"` Labels map[string]string `json:"labels,omitempty"`
Del bool `json:"del,omitempty"` Del bool `json:"del,omitempty"`
Request rateMap `json:"request,omitempty"` Request rateMap `json:"request,omitempty"`
@ -393,8 +394,9 @@ func addDownTrack(c *webClient, conn *rtpDownConnection, remoteTrack upTrack, re
return s, nil return s, nil
} }
func negotiate(c *webClient, down *rtpDownConnection) error { func negotiate(c *webClient, down *rtpDownConnection, renegotiate, restartIce bool) error {
offer, err := down.pc.CreateOffer(nil) options := webrtc.OfferOptions{ICERestart: restartIce}
offer, err := down.pc.CreateOffer(&options)
if err != nil { if err != nil {
return err return err
} }
@ -425,6 +427,7 @@ func negotiate(c *webClient, down *rtpDownConnection) error {
Type: "offer", Type: "offer",
Id: down.id, Id: down.id,
Offer: &offer, Offer: &offer,
Renegotiate: renegotiate,
Labels: labels, Labels: labels,
}) })
} }
@ -733,7 +736,7 @@ func clientLoop(c *webClient, conn *websocket.Conn) error {
return err return err
} }
if down != nil { if down != nil {
err = negotiate(c, down) err = negotiate(c, down, false, false)
if err != nil { if err != nil {
log.Printf("Negotiate: %v", err) log.Printf("Negotiate: %v", err)
delDownConn(c, down.id) delDownConn(c, down.id)
@ -769,7 +772,11 @@ func clientLoop(c *webClient, conn *websocket.Conn) error {
"unknown connection") "unknown connection")
continue continue
} }
tracks := make([]upTrack, len(down.tracks)) err := negotiate(c, down, true, true)
if err != nil {
tracks := make(
[]upTrack, len(down.tracks),
)
for i, t := range down.tracks { for i, t := range down.tracks {
tracks[i] = t.remote tracks[i] = t.remote
} }
@ -777,6 +784,7 @@ func clientLoop(c *webClient, conn *websocket.Conn) error {
down.remote.Id(), down.remote, down.remote.Id(), down.remote,
tracks, down.remote.Label(), tracks, down.remote.Label(),
) )
}
case permissionsChangedAction: case permissionsChangedAction:
c.write(clientMessage{ c.write(clientMessage{
Type: "permissions", Type: "permissions",