diff options
author | Joas Schilling <213943+nickvergessen@users.noreply.github.com> | 2019-12-04 10:45:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-04 10:45:07 +0300 |
commit | 0eaf8ab35c1c623cbd458f21457fb22c202c8fad (patch) | |
tree | e1f93735bc6e33a1bd9b4033567e85e5b94e0d97 | |
parent | f4bd285e241802bb2153ed8bbe466919e0e072a3 (diff) | |
parent | 6276099d25bb5a4c345607286658b74cef3171d6 (diff) |
Merge pull request #2475 from nextcloud/request-offer-again-when-receiving-peer-fails
[stable17] Request offer again when receiving peer fails
-rw-r--r-- | js/views/videoview.js | 12 | ||||
-rw-r--r-- | js/webrtc.js | 51 |
2 files changed, 54 insertions, 9 deletions
diff --git a/js/views/videoview.js b/js/views/videoview.js index 2e62f502a..ae6c60cb6 100644 --- a/js/views/videoview.js +++ b/js/views/videoview.js @@ -130,8 +130,18 @@ this._rawParticipantName = rawParticipantName; this._participantName = participantName; + // Restore icon if needed after "avatar()" resets it. + var restoreIconLoadingCallback = function() { + if (this._connectionStatus === ConnectionStatus.NEW || + this._connectionStatus === ConnectionStatus.CHECKING || + this._connectionStatus === ConnectionStatus.DISCONNECTED_LONG || + this._connectionStatus === ConnectionStatus.FAILED) { + this.getUI('avatar').addClass('icon-loading'); + } + }.bind(this); + if (userId && userId.length) { - this.getUI('avatar').avatar(userId, this.participantAvatarSize); + this.getUI('avatar').avatar(userId, this.participantAvatarSize, undefined, undefined, restoreIconLoadingCallback); } else { this.getUI('avatar').imageplaceholder('?', rawParticipantName, this.participantAvatarSize); this.getUI('avatar').css('background-color', '#b9b9b9'); diff --git a/js/webrtc.js b/js/webrtc.js index 225fcd27f..39a61e6bf 100644 --- a/js/webrtc.js +++ b/js/webrtc.js @@ -17,7 +17,7 @@ var spreedPeerConnectionTable = []; var ownScreenPeer = null; var hasLocalMedia = false; var selfInCall = 0; // OCA.SpreedMe.app.FLAG_DISCONNECTED, not available yet. - var delayedCreatePeer = []; + var delayedConnectionToPeer = []; function updateParticipantsUI(currentUsersNo) { 'use strict'; @@ -196,6 +196,12 @@ var spreedPeerConnectionTable = []; if (useMcu) { // TODO(jojo): Already create peer object to avoid duplicate offers. webrtc.connection.requestOffer(user, "video"); + + delayedConnectionToPeer[user.sessionId] = setInterval(function() { + console.log('No offer received for new peer, request offer again'); + + webrtc.connection.requestOffer(user, 'video'); + }, 10000); } else if (userHasStreams(selfInCall) && (!userHasStreams(user) || sessionId < currentSessionId)) { // To avoid overloading the user joining a room (who previously called // all the other participants), we decide who calls who by comparing @@ -209,7 +215,19 @@ var spreedPeerConnectionTable = []; // offer in a reasonable time, the current peer calls the // remote peer instead of waiting to be called to // reestablish the connection. - delayedCreatePeer[sessionId] = setTimeout(function() { + delayedConnectionToPeer[sessionId] = setInterval(function() { + // New offers are periodically sent until a connection + // is established. As an offer can not be sent again + // from an existing peer it must be removed and a new + // one must be created from scratch. + webrtc.webrtc.getPeers(sessionId, 'video').forEach(function(peer) { + peer.end(); + + OCA.SpreedMe.speakers.remove(peer.id, true); + OCA.SpreedMe.videos.remove(peer.id); + }); + + console.log("No offer nor answer received, sending offer again"); createPeer(); }, 10000); } @@ -228,9 +246,9 @@ var spreedPeerConnectionTable = []; OCA.SpreedMe.videos.remove(sessionId); delete spreedMappingTable[sessionId]; delete guestNamesTable[sessionId]; - if (delayedCreatePeer[sessionId]) { - clearTimeout(delayedCreatePeer[sessionId]); - delete delayedCreatePeer[sessionId]; + if (delayedConnectionToPeer[sessionId]) { + clearInterval(delayedConnectionToPeer[sessionId]); + delete delayedConnectionToPeer[sessionId]; } }); @@ -326,6 +344,13 @@ var spreedPeerConnectionTable = []; }); signaling.on('message', function (message) { + if (message.type === 'answer' && message.roomType === 'video' && delayedConnectionToPeer[message.from]) { + clearInterval(delayedConnectionToPeer[message.from]); + delete delayedConnectionToPeer[message.from]; + + return; + } + if (message.type !== 'offer') { return; } @@ -348,9 +373,9 @@ var spreedPeerConnectionTable = []; } } - if (message.roomType === 'video' && delayedCreatePeer[message.from]) { - clearTimeout(delayedCreatePeer[message.from]); - delete delayedCreatePeer[message.from]; + if (message.roomType === 'video' && delayedConnectionToPeer[message.from]) { + clearInterval(delayedConnectionToPeer[message.from]); + delete delayedConnectionToPeer[message.from]; } if (!selfInCall) { @@ -594,6 +619,16 @@ var spreedPeerConnectionTable = []; videoView.setConnectionStatus(OCA.Talk.Views.VideoView.ConnectionStatus.FAILED_NO_RESTART); } + } else { + console.log('Request offer again'); + + signaling.requestOffer(peer.id, 'video'); + + delayedConnectionToPeer[peer.id] = setInterval(function() { + console.log('No offer received, request offer again'); + + signaling.requestOffer(peer.id, 'video'); + }, 10000); } break; case 'closed': |