Commit 6a37033c authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Allow both sides to initiate renegotiation.

More reliable reaction to network failures when they are detected
by just one side.
parent 7aab79c4
...@@ -648,6 +648,17 @@ function serverConnect() { ...@@ -648,6 +648,17 @@ function serverConnect() {
case 'answer': case 'answer':
gotAnswer(m.id, m.answer); gotAnswer(m.id, m.answer);
break; break;
case 'renegotiate':
let c = up[id];
if(c) {
try {
c.pc.restartIce()
} catch(e) {
console.error(e);
displayError(e);
}
}
break;
case 'close': case 'close':
gotClose(m.id); gotClose(m.id);
break; break;
...@@ -743,6 +754,11 @@ async function gotOffer(id, labels, offer, renegotiate) { ...@@ -743,6 +754,11 @@ async function gotOffer(id, labels, offer, renegotiate) {
pc.oniceconnectionstatechange = e => { pc.oniceconnectionstatechange = e => {
setMediaStatus(id); setMediaStatus(id);
if(pc.iceConnectionState === 'failed') {
send({type: 'renegotiate',
id: id,
});
}
} }
c.pc.ontrack = function(e) { c.pc.ontrack = function(e) {
...@@ -1179,7 +1195,7 @@ async function newUpStream(id) { ...@@ -1179,7 +1195,7 @@ async function newUpStream(id) {
pc.onnegotiationneeded = async e => { pc.onnegotiationneeded = async e => {
try { try {
await negotiate(id); await negotiate(id, false);
} catch(e) { } catch(e) {
console.error(e); console.error(e);
displayError(e); displayError(e);
...@@ -1213,7 +1229,7 @@ async function newUpStream(id) { ...@@ -1213,7 +1229,7 @@ async function newUpStream(id) {
return id; return id;
} }
async function negotiate(id) { async function negotiate(id, restartIce) {
let c = up[id]; let c = up[id];
if(!c) if(!c)
throw new Error('unknown connection'); throw new Error('unknown connection');
...@@ -1221,7 +1237,7 @@ async function negotiate(id) { ...@@ -1221,7 +1237,7 @@ async function negotiate(id) {
if(typeof(c.pc.getTransceivers) !== 'function') if(typeof(c.pc.getTransceivers) !== 'function')
throw new Error('Browser too old, please upgrade'); throw new Error('Browser too old, please upgrade');
let offer = await c.pc.createOffer({}); let offer = await c.pc.createOffer({iceRestart: restartIce});
if(!offer) if(!offer)
throw(new Error("Didn't create offer")); throw(new Error("Didn't create offer"));
await c.pc.setLocalDescription(offer); await c.pc.setLocalDescription(offer);
......
...@@ -236,6 +236,12 @@ func addUpConn(c *webClient, id string) (*rtpUpConnection, bool, error) { ...@@ -236,6 +236,12 @@ func addUpConn(c *webClient, id string) (*rtpUpConnection, bool, error) {
sendICE(c, id, candidate) sendICE(c, id, candidate)
}) })
conn.pc.OnICEConnectionStateChange(func(state webrtc.ICEConnectionState) {
if state == webrtc.ICEConnectionStateFailed {
c.action(connectionFailedAction{id: id})
}
})
return conn, true, nil return conn, true, nil
} }
...@@ -772,14 +778,11 @@ func clientLoop(c *webClient, conn *websocket.Conn) error { ...@@ -772,14 +778,11 @@ func clientLoop(c *webClient, conn *websocket.Conn) error {
go a.c.pushConn(u.id, u, ts, u.label) go a.c.pushConn(u.id, u, ts, u.label)
} }
case connectionFailedAction: case connectionFailedAction:
down := getDownConn(c, a.id) if down := getDownConn(c, a.id); down != nil {
if down == nil { err := negotiate(c, down, true, true)
log.Printf("Failed indication for " + if err == nil {
"unknown connection") return err
continue }
}
err := negotiate(c, down, true, true)
if err != nil {
tracks := make( tracks := make(
[]upTrack, len(down.tracks), []upTrack, len(down.tracks),
) )
...@@ -790,7 +793,16 @@ func clientLoop(c *webClient, conn *websocket.Conn) error { ...@@ -790,7 +793,16 @@ 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(),
) )
} else if up := getUpConn(c, a.id); up != nil {
c.write(clientMessage{
Type: "renegotiate",
Id: a.id,
})
} else {
log.Printf("Attempting to renegotiate " +
"unknown connection")
} }
case permissionsChangedAction: case permissionsChangedAction:
c.write(clientMessage{ c.write(clientMessage{
Type: "permissions", Type: "permissions",
...@@ -930,6 +942,16 @@ func handleClientMessage(c *webClient, m clientMessage) error { ...@@ -930,6 +942,16 @@ func handleClientMessage(c *webClient, m clientMessage) error {
if err != nil { if err != nil {
return err return err
} }
case "renegotiate":
down := getDownConn(c, m.Id)
if down != nil {
err := negotiate(c, down, true, true)
if err != nil {
return err
}
} else {
log.Printf("Trying to renegotiate unknown connection")
}
case "close": case "close":
found := delUpConn(c, m.Id) found := delUpConn(c, m.Id)
if !found { if !found {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment