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:
authorJoachim Bauch <bauch@struktur.de>2017-11-20 16:10:55 +0300
committerJoachim Bauch <bauch@struktur.de>2018-02-02 18:03:13 +0300
commitb1e69847420f9ea7a73e6b4155ef12ff53551e14 (patch)
tree5894f68b6c9e8bb6bb8e33bf7ca7ac588ac51453 /js/webrtc.js
parent6da292c41be509f0b8a4f4ee94fae79fa6079b2c (diff)
Split "room" from "call" when using the standalone signaling server.
Clients use the regular joinRoom/-Call API and get a Nextcloud session id. No special handling for sessions from the standalone signaling server are required. The signaling server regularly "pings" active sessions to prevent them from timing out (in case of guest users). Signed-off-by: Joachim Bauch <bauch@struktur.de>
Diffstat (limited to 'js/webrtc.js')
-rw-r--r--js/webrtc.js93
1 files changed, 58 insertions, 35 deletions
diff --git a/js/webrtc.js b/js/webrtc.js
index 870f657a2..55ba34f60 100644
--- a/js/webrtc.js
+++ b/js/webrtc.js
@@ -12,6 +12,7 @@ var spreedPeerConnectionTable = [];
OCA.SpreedMe = OCA.SpreedMe || {};
var previousUsersInRoom = [];
+ var usersInCallMapping = {};
function updateParticipantsUI(currentUsersNo) {
'use strict';
@@ -110,6 +111,49 @@ var spreedPeerConnectionTable = [];
updateParticipantsUI(previousUsersInRoom.length + 1);
}
+ function usersInCallChanged(users) {
+ // The passed list are the users that are currently in the room,
+ // i.e. that are in the call and should call each other.
+ var currentSessionId = webrtc.connection.getSessionid();
+ var currentUsersInRoom = [];
+ var userMapping = {};
+ var selfInCall = false;
+ var sessionId;
+ for (sessionId in users) {
+ if (!users.hasOwnProperty(sessionId)) {
+ continue;
+ }
+ var user = users[sessionId];
+ if (!user.inCall) {
+ continue;
+ }
+
+ if (sessionId === currentSessionId) {
+ selfInCall = true;
+ continue;
+ }
+
+ currentUsersInRoom.push(sessionId);
+ userMapping[sessionId] = user;
+ }
+
+ if (!selfInCall) {
+ // Own session is no longer in the call, disconnect from all others.
+ usersChanged([], previousUsersInRoom);
+ return;
+ }
+
+ var newSessionIds = currentUsersInRoom.diff(previousUsersInRoom);
+ var disconnectedSessionIds = previousUsersInRoom.diff(currentUsersInRoom);
+ var newUsers = [];
+ newSessionIds.forEach(function(sessionId) {
+ newUsers.push(userMapping[sessionId]);
+ });
+ if (newUsers.length || disconnectedSessionIds.length) {
+ usersChanged(newUsers, disconnectedSessionIds);
+ }
+ }
+
function initWebRTC() {
'use strict';
Array.prototype.diff = function(a) {
@@ -119,47 +163,26 @@ var spreedPeerConnectionTable = [];
};
var signaling = OCA.SpreedMe.createSignalingConnection();
- signaling.on('usersJoined', function(users) {
- usersChanged(users, []);
- });
signaling.on('usersLeft', function(users) {
+ users.forEach(function(user) {
+ delete usersInCallMapping[user];
+ });
usersChanged([], users);
});
- signaling.on('usersInRoom', function(users) {
- // The passed list are the users that are currently in the room,
- // i.e. that are in the call and should call each other.
- var currentSessionId = webrtc.connection.getSessionid();
- var currentUsersInRoom = [];
- var userMapping = {};
- var selfInCall = false;
+ signaling.on('usersChanged', function(users) {
users.forEach(function(user) {
- if (!user['inCall']) {
- return;
- }
-
- var sessionId = user['sessionId'] || user.sessionid;
- if (sessionId === currentSessionId) {
- selfInCall = true;
- return;
- }
-
- currentUsersInRoom.push(sessionId);
- userMapping[sessionId] = user;
+ var sessionId = user.sessionId || user.sessionid;
+ usersInCallMapping[sessionId] = user;
});
-
- if (!selfInCall) {
- return;
- }
-
- var newSessionIds = currentUsersInRoom.diff(previousUsersInRoom);
- var disconnectedSessionIds = previousUsersInRoom.diff(currentUsersInRoom);
- var newUsers = [];
- newSessionIds.forEach(function(sessionId) {
- newUsers.push(userMapping[sessionId]);
+ usersInCallChanged(usersInCallMapping);
+ });
+ signaling.on('usersInRoom', function(users) {
+ usersInCallMapping = {};
+ users.forEach(function(user) {
+ var sessionId = user.sessionId || user.sessionid;
+ usersInCallMapping[sessionId] = user;
});
- if (newUsers.length || disconnectedSessionIds.length) {
- usersChanged(newUsers, disconnectedSessionIds);
- }
+ usersInCallChanged(usersInCallMapping);
});
var nick = OC.getCurrentUser()['displayName'];