diff --git a/src/peer.js b/src/peer.js index 59f66bd4..a426bcfe 100644 --- a/src/peer.js +++ b/src/peer.js @@ -33,6 +33,7 @@ function Peer(options) { this.receiveMedia = options.receiveMedia || this.parent.config.receiveMedia; this.channels = {}; this.sid = options.sid || Date.now().toString(); + this.iceRestart = false; // Create an RTCPeerConnection via the polyfill this.pc = new PeerConnection(this.parent.config.peerConnectionConfig, this.parent.config.peerConnectionConstraints); this.pc.on('ice', this.onIceCandidate.bind(this)); @@ -153,6 +154,11 @@ Peer.prototype.send = function (messageType, payload) { payload: payload, prefix: webrtcSupport.prefix }; + if (this.iceRestart) { + message.iceRestart = true; + message.oldSessionId = this.oldSessionId; + this.iceRestart = false; + } this.logger.log('sending', messageType, message); this.parent.emit('message', message); }; @@ -225,10 +231,16 @@ Peer.prototype.start = function () { //self.send('offer', sessionDescription); }); }; - -Peer.prototype.icerestart = function () { +/* + @sessionId - webrtc id from which the icerestart has been initiated. Using it to keep the old + session. + */ +Peer.prototype.icerestart = function (sessionId) { var constraints = this.receiveMedia; - constraints.mandatory.IceRestart = true; + this.iceRestart = true; + this.oldSessionId = sessionId; + constraints.iceRestart = true; + this.parent.emit('iceRestart'); this.pc.offer(constraints, function (err, success) { }); }; diff --git a/src/simplewebrtc.js b/src/simplewebrtc.js index 72844424..9e11fd63 100644 --- a/src/simplewebrtc.js +++ b/src/simplewebrtc.js @@ -36,6 +36,8 @@ function SimpleWebRTC(opts) { }; var item, connection; + this.iceRestart = false; + // We also allow a 'logger' option. It can be any object that implements // log, warn, and error methods. // We log nothing by default, following "the rule of silence": @@ -80,13 +82,25 @@ function SimpleWebRTC(opts) { }); connection.on('message', function (message) { - var peers = self.webrtc.getPeers(message.from, message.roomType); - var peer; + var peers, peer; + if (message.iceRestart) { + peers = self.webrtc.getPeers(message.oldSessionId, message.roomType); + + self.iceRestart = true; + } + else{ + peers = self.webrtc.getPeers(message.from, message.roomType); + } if (message.type === 'offer') { if (peers.length) { peers.forEach(function (p) { - if (p.sid == message.sid) peer = p; + if (p.sid == message.sid) { + peer = p; + if (message.iceRestart) { + self.webrtc.updatePeerId(peer, message.from); + } + } }); //if (!peer) peer = peers[0]; // fallback for old protocol versions } @@ -248,6 +262,14 @@ function SimpleWebRTC(opts) { } }); + this.webrtc.on('iceRestart', function() { + self.connection.emit('join', self.roomName, function(err, roomDescription) { + if(err) { + self.emit('error', err) + } + }); + }); + if (this.config.autoRequestMedia) this.startLocalVideo(); } diff --git a/src/webrtc.js b/src/webrtc.js index 54458b92..ee0837e5 100644 --- a/src/webrtc.js +++ b/src/webrtc.js @@ -122,6 +122,10 @@ WebRTC.prototype.createPeer = function (opts) { return peer; }; +WebRTC.prototype.updatePeerId = function(peer, sessionId) { + peer.id = sessionId; +}; + // removes peers WebRTC.prototype.removePeers = function (id, type) { this.getPeers(id, type).forEach(function (peer) {