Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/spreed.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoas Schilling <213943+nickvergessen@users.noreply.github.com>2019-12-04 10:45:07 +0300
committerGitHub <noreply@github.com>2019-12-04 10:45:07 +0300
commit0eaf8ab35c1c623cbd458f21457fb22c202c8fad (patch)
treee1f93735bc6e33a1bd9b4033567e85e5b94e0d97
parentf4bd285e241802bb2153ed8bbe466919e0e072a3 (diff)
parent6276099d25bb5a4c345607286658b74cef3171d6 (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.js12
-rw-r--r--js/webrtc.js51
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':