From 30b37f67de81f5bbd9225c299c29ce2341836c2e Mon Sep 17 00:00:00 2001
From: Moritz Langenstein <ml5717@ic.ac.uk>
Date: Fri, 25 Oct 2019 17:53:25 +0100
Subject: [PATCH] (ml5717) (alh1717) (ztw17) Remove duplicate (possibly stale)
 old connections on reconnect

Removal up old unused stale connections still necessary (i.e. disconnected peer changed their ID) -> might need heartbeat / dropped messages analysis
---
 dist/liowebrtc.js | 119 ++++++++++++++++++++++++++++------------------
 src/liowebrtc.js  |  25 +++++++---
 2 files changed, 93 insertions(+), 51 deletions(-)

diff --git a/dist/liowebrtc.js b/dist/liowebrtc.js
index 0223f29..5550e50 100644
--- a/dist/liowebrtc.js
+++ b/dist/liowebrtc.js
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
   value: true
 });
 
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
 var _wildemitter = require('wildemitter');
@@ -104,13 +106,17 @@ var LioWebRTC = function (_WildEmitter) {
       var peers = self.webrtc.getPeers(message.from, message.roomType);
       var totalPeers = self.webrtc.getPeers().length;
       var peer = void 0;
-
       if (message.type === 'offer') {
         if (peers.length) {
           peers.forEach(function (p) {
             if (p.sid === message.sid) peer = p;
           });
-          // if (!peer) peer = peers[0]; // fallback for old protocol versions
+          peers.forEach(function (p) {
+            if (p !== peer) {
+              p.end(false);
+              totalPeers--;
+            }
+          });
         }
         if (_this.config.dataOnly && _this.config.constraints.maxPeers > 0 && totalPeers >= _this.config.constraints.maxPeers) {
           return;
@@ -490,7 +496,6 @@ var LioWebRTC = function (_WildEmitter) {
           var peer = void 0;
 
           _this5.roomCount = Object.keys(roomDescription.clients).length;
-          // console.log(roomDescription);
           _this5.id = roomDescription.you;
           (0, _PeerOptimizer.addNode)(_this5.id);
           _this5.unconnectivePeers[_this5.id] = true;
@@ -507,27 +512,38 @@ var LioWebRTC = function (_WildEmitter) {
               client = roomDescription.clients[id];
               for (type in client) {
                 if (type !== 'turnservers' && client[type]) {
-                  console.log('Received peer info about', id, 'on room join');
-                  var peerCount = _this5.webrtc.getPeers().length;
-                  if (_this5.config.dataOnly && _this5.config.constraints.maxPeers > 0 && (peerCount >= _this5.config.constraints.minPeers || peerCount >= _this5.config.constraints.maxPeers)) {
-                    return;
-                  }
-                  peer = self.webrtc.createPeer({
-                    id: id,
-                    type: type,
-                    enableDataChannels: self.config.enableDataChannels && type !== 'screen',
-                    receiveMedia: {
-                      offerToReceiveAudio: type !== 'screen' && !_this5.config.dataOnly && _this5.config.receiveMedia.offerToReceiveAudio ? 1 : 0,
-                      offerToReceiveVideo: !_this5.config.dataOnly && self.config.receiveMedia.offerToReceiveVideo ? 1 : 0
-                    },
-                    iceServers: self.webrtc.config.peerConnectionConfig.iceServers.concat(client.turnservers)
-                  });
-                  if (_this5.config.dataOnly && _this5.config.constraints.maxPeers > 0) {
-                    _this5.sendPing(peer, peer.id, true);
-                  } else {
-                    peer.start();
-                    _this5.emit('createdPeer', peer);
-                  }
+                  var _ret = function () {
+                    console.log('Received peer info about', id, 'on room join');
+                    var peerCount = _this5.webrtc.getPeers().length;
+                    var peers = self.webrtc.getPeers(id, type);
+                    peers.forEach(function (p) {
+                      p.end(false);
+                      peerCount--;
+                    });
+                    if (_this5.config.dataOnly && _this5.config.constraints.maxPeers > 0 && (peerCount >= _this5.config.constraints.minPeers || peerCount >= _this5.config.constraints.maxPeers)) {
+                      return {
+                        v: void 0
+                      };
+                    }
+                    peer = self.webrtc.createPeer({
+                      id: id,
+                      type: type,
+                      enableDataChannels: self.config.enableDataChannels && type !== 'screen',
+                      receiveMedia: {
+                        offerToReceiveAudio: type !== 'screen' && !_this5.config.dataOnly && _this5.config.receiveMedia.offerToReceiveAudio ? 1 : 0,
+                        offerToReceiveVideo: !_this5.config.dataOnly && self.config.receiveMedia.offerToReceiveVideo ? 1 : 0
+                      },
+                      iceServers: self.webrtc.config.peerConnectionConfig.iceServers.concat(client.turnservers)
+                    });
+                    if (_this5.config.dataOnly && _this5.config.constraints.maxPeers > 0) {
+                      _this5.sendPing(peer, peer.id, true);
+                    } else {
+                      peer.start();
+                      _this5.emit('createdPeer', peer);
+                    }
+                  }();
+
+                  if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
                 }
               }
             }
@@ -607,31 +623,44 @@ var LioWebRTC = function (_WildEmitter) {
   }, {
     key: 'connectToPeer',
     value: function connectToPeer(peerId, client) {
+      var _this7 = this;
+
       var type = void 0;
       var peer = void 0;
       for (type in client) {
         if (type !== 'turnservers' && client[type]) {
-          console.log('Connecting to random peer', peerId);
-          var peerCount = this.webrtc.getPeers().length;
-          if (this.config.constraints.maxPeers > 0 && peerCount >= this.config.constraints.maxPeers) {
-            return;
-          }
-          peer = this.webrtc.createPeer({
-            id: peerId,
-            type: type,
-            enableDataChannels: this.config.enableDataChannels && type !== 'screen',
-            receiveMedia: {
-              offerToReceiveAudio: type !== 'screen' && !this.config.dataOnly && this.config.receiveMedia.offerToReceiveAudio ? 1 : 0,
-              offerToReceiveVideo: !this.config.dataOnly && this.config.receiveMedia.offerToReceiveVideo ? 1 : 0
-            },
-            iceServers: self.webrtc.config.peerConnectionConfig.iceServers.concat(client.turnservers)
-          });
-          if (this.config.dataOnly && this.config.constraints.maxPeers > 0) {
-            this.sendPing(peer, peerId, true);
-          } else {
-            peer.start();
-            this.emit('createdPeer', peer);
-          }
+          var _ret2 = function () {
+            console.log('Connecting to random peer', peerId);
+            var peerCount = _this7.webrtc.getPeers().length;
+            var peers = self.webrtc.getPeers(peerId, type);
+            peers.forEach(function (p) {
+              p.end(false);
+              peerCount--;
+            });
+            if (_this7.config.constraints.maxPeers > 0 && peerCount >= _this7.config.constraints.maxPeers) {
+              return {
+                v: void 0
+              };
+            }
+            peer = _this7.webrtc.createPeer({
+              id: peerId,
+              type: type,
+              enableDataChannels: _this7.config.enableDataChannels && type !== 'screen',
+              receiveMedia: {
+                offerToReceiveAudio: type !== 'screen' && !_this7.config.dataOnly && _this7.config.receiveMedia.offerToReceiveAudio ? 1 : 0,
+                offerToReceiveVideo: !_this7.config.dataOnly && _this7.config.receiveMedia.offerToReceiveVideo ? 1 : 0
+              },
+              iceServers: self.webrtc.config.peerConnectionConfig.iceServers.concat(client.turnservers)
+            });
+            if (_this7.config.dataOnly && _this7.config.constraints.maxPeers > 0) {
+              _this7.sendPing(peer, peerId, true);
+            } else {
+              peer.start();
+              _this7.emit('createdPeer', peer);
+            }
+          }();
+
+          if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v;
         }
       }
     }
diff --git a/src/liowebrtc.js b/src/liowebrtc.js
index cf65ca8..7382645 100644
--- a/src/liowebrtc.js
+++ b/src/liowebrtc.js
@@ -60,15 +60,19 @@ class LioWebRTC extends WildEmitter {
 
     connection.on('message', (message) => {
       const peers = self.webrtc.getPeers(message.from, message.roomType);
-      const totalPeers = self.webrtc.getPeers().length;
+      let totalPeers = self.webrtc.getPeers().length;
       let peer;
-
       if (message.type === 'offer') {
         if (peers.length) {
           peers.forEach((p) => {
             if (p.sid === message.sid) peer = p;
           });
-          // if (!peer) peer = peers[0]; // fallback for old protocol versions
+          peers.forEach((p) => {
+            if (p !== peer) {
+              p.end(false);
+              totalPeers--;
+            }
+          });
         }
         if (this.config.dataOnly && this.config.constraints.maxPeers > 0 && totalPeers >= this.config.constraints.maxPeers) {
           return;
@@ -404,7 +408,6 @@ class LioWebRTC extends WildEmitter {
         let peer;
 
         this.roomCount = Object.keys(roomDescription.clients).length;
-        // console.log(roomDescription);
         this.id = roomDescription.you;
         addNode(this.id);
         this.unconnectivePeers[this.id] = true;
@@ -413,7 +416,12 @@ class LioWebRTC extends WildEmitter {
           for (type in client) {
             if (type !== 'turnservers' && client[type]) {
               console.log('Received peer info about', id, 'on room join')
-              const peerCount = this.webrtc.getPeers().length;
+              let peerCount = this.webrtc.getPeers().length;
+              const peers = self.webrtc.getPeers(id, type);
+              peers.forEach((p) => {
+                p.end(false);
+                peerCount--;
+              });
               if (this.config.dataOnly && this.config.constraints.maxPeers > 0 && (peerCount >= this.config.constraints.minPeers || peerCount >= this.config.constraints.maxPeers)) {
                 return;
               }
@@ -493,7 +501,12 @@ class LioWebRTC extends WildEmitter {
     for (type in client) {
       if (type !== 'turnservers' && client[type]) {
         console.log('Connecting to random peer', peerId)
-        const peerCount = this.webrtc.getPeers().length;
+        let peerCount = this.webrtc.getPeers().length;
+        const peers = self.webrtc.getPeers(peerId, type);
+        peers.forEach((p) => {
+          p.end(false);
+          peerCount--;
+        });
         if (this.config.constraints.maxPeers > 0 && peerCount >= this.config.constraints.maxPeers) {
           return;
         }
-- 
GitLab