Commit c0122c06 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Implement restartIce for older browsers.

parent aa876bcd
...@@ -386,14 +386,8 @@ ServerConnection.prototype.newUpStream = function(id) { ...@@ -386,14 +386,8 @@ ServerConnection.prototype.newUpStream = function(id) {
pc.oniceconnectionstatechange = e => { pc.oniceconnectionstatechange = e => {
if(c.onstatus) if(c.onstatus)
c.onstatus.call(c, pc.iceConnectionState); c.onstatus.call(c, pc.iceConnectionState);
if(pc.iceConnectionState === 'failed') { if(pc.iceConnectionState === 'failed')
try { c.restartIce();
/** @ts-ignore */
pc.restartIce();
} catch(e) {
console.warn(e);
}
}
} }
pc.ontrack = console.error; pc.ontrack = console.error;
...@@ -587,12 +581,7 @@ ServerConnection.prototype.gotRenegotiate = async function(id) { ...@@ -587,12 +581,7 @@ ServerConnection.prototype.gotRenegotiate = async function(id) {
let c = this.up[id]; let c = this.up[id];
if(!c) if(!c)
throw new Error('unknown up stream'); throw new Error('unknown up stream');
try { c.restartIce();
/** @ts-ignore */
c.pc.restartIce();
} catch(e) {
console.warn(e);
}
} }
/** /**
...@@ -837,12 +826,17 @@ Stream.prototype.flushIceCandidates = async function () { ...@@ -837,12 +826,17 @@ Stream.prototype.flushIceCandidates = async function () {
* automatically when required. If the client requires renegotiation, it * automatically when required. If the client requires renegotiation, it
* is probably more effective to call restartIce on the underlying PC * is probably more effective to call restartIce on the underlying PC
* rather than invoking this function directly. * rather than invoking this function directly.
*
* @function * @function
* @param {boolean} [restartIce]
*/ */
Stream.prototype.negotiate = async function () { Stream.prototype.negotiate = async function (restartIce) {
let c = this; let c = this;
let offer = await c.pc.createOffer(); let options = null;
if(restartIce)
options = {iceRestart: true};
let offer = await c.pc.createOffer(options);
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);
...@@ -867,6 +861,30 @@ Stream.prototype.negotiate = async function () { ...@@ -867,6 +861,30 @@ Stream.prototype.negotiate = async function () {
}); });
} }
/**
* restartIce causes an ICE restart on an up stream. It is called
* automatically when ICE signals that the connection has failed. It
* returns immediately, negotiation will happen asynchronously.
*/
Stream.prototype.restartIce = function () {
let c = this;
/** @ts-ignore */
if(typeof c.pc.restartIce === 'function') {
try {
/** @ts-ignore */
c.pc.restartIce();
return;
} catch(e) {
console.warn(e);
}
}
// negotiate is async, but this returns immediately.
c.negotiate(true);
}
/** /**
* updateStats is called periodically, if requested by setStatsInterval, * updateStats is called periodically, if requested by setStatsInterval,
* in order to recompute stream statistics and invoke the onstats handler. * in order to recompute stream statistics and invoke the onstats handler.
......
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