summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Calviño Sánchez <danxuliu@gmail.com>2022-02-25 20:58:52 +0100
committerDaniel Calviño Sánchez <danxuliu@gmail.com>2022-02-25 21:16:02 +0100
commitcc3aac057ce756aa6fe7f051574930d369f6d4bb (patch)
treefa9589b90e761aab72ec8e3b57369137d743db10
parent53ebe16bce69ccde46ba6a9ff1d5825e54895a51 (diff)
Create and destroy Peers based on call flag changes
Instead of relying on forced reconnections made by the publisher when media was started or stopped (and there was no other media stream) now the changes in the call flags are monitored to proactively create and destroy Peers as needed. This will make possible to get rid of forced reconnections in those cases (but this needs to be supported by the mobile clients too before forced reconnections no longer need to be triggered). Note that, technically, even if all media streams are stopped there is no real need to destroy the Peer object and stop the connection, as the publisher will still keep the connection open, although with null tracks. Nevertheless, closing the connection once no longer needed does no harm either, and it can be started again later if needed. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
-rw-r--r--src/utils/webrtc/webrtc.js74
1 files changed, 71 insertions, 3 deletions
diff --git a/src/utils/webrtc/webrtc.js b/src/utils/webrtc/webrtc.js
index 02ed0e37a..67d563325 100644
--- a/src/utils/webrtc/webrtc.js
+++ b/src/utils/webrtc/webrtc.js
@@ -72,6 +72,17 @@ function arrayDiff(a, b) {
}
/**
+ * @param {Array} a First array
+ * @param {Array} b Second array
+ * @return {Array} Array with the common elements
+ */
+function arrayCommon(a, b) {
+ return a.filter(function(i) {
+ return b.includes(i)
+ })
+}
+
+/**
* @param {object} signaling The signaling object
* @param {string} sessionId The user's sessionId
*/
@@ -270,6 +281,19 @@ function userHasStreams(user) {
}
/**
+ * @param {object} user The user to check
+ * @return {boolean} True if the user has a Peer object (not closed), or will
+ * have a Peer object due to a delayed connection
+ */
+function userHasPeer(user) {
+ const sessionId = user.sessionId || user.sessionid
+ const callParticipantModel = callParticipantCollection.get(sessionId)
+
+ return delayedConnectionToPeer[sessionId]
+ || (callParticipantModel.get('peer') && !callParticipantModel.get('peer').closed)
+}
+
+/**
* @param {object} signaling The signaling object
* @param {object} user The participant to create a peer for
*/
@@ -339,9 +363,18 @@ function createPeerForParticipant(signaling, user) {
* @param {object} signaling The signaling object
* @param {Array} newUsers Newly added participants
* @param {Array} disconnectedSessionIds Remove participants
+ * @param {Array} changedPublishers Participants that were already in the call
+ * and started or stopped publishing
*/
-function usersChanged(signaling, newUsers, disconnectedSessionIds) {
+function usersChanged(signaling, newUsers, disconnectedSessionIds, changedPublishers) {
'use strict'
+
+ // The parameter can not be initialised to a default value in strict
+ // functions, so it needs to be done here.
+ if (!changedPublishers) {
+ changedPublishers = []
+ }
+
const currentSessionId = signaling.getSessionId()
let playJoinSound = false
@@ -421,6 +454,31 @@ function usersChanged(signaling, newUsers, disconnectedSessionIds) {
}
})
+ changedPublishers.forEach(function(changedPublisher) {
+ // TODO(fancycode): Adjust property name of internal PHP backend to be all lowercase.
+ const sessionId = changedPublisher.sessionId || changedPublisher.sessionid
+ if (!sessionId || sessionId === currentSessionId) {
+ return
+ }
+
+ if (userHasStreams(changedPublisher) && userHasPeer(changedPublisher)) {
+ return
+ }
+
+ if (userHasStreams(changedPublisher)) {
+ createPeerForParticipant(signaling, changedPublisher)
+
+ return
+ }
+
+ webrtc.removePeers(sessionId)
+
+ if (delayedConnectionToPeer[sessionId]) {
+ clearInterval(delayedConnectionToPeer[sessionId])
+ delete delayedConnectionToPeer[sessionId]
+ }
+ })
+
disconnectedSessionIds.forEach(function(sessionId) {
console.debug('Remove disconnected peer', sessionId)
webrtc.removePeers(sessionId)
@@ -521,12 +579,22 @@ function usersInCallChanged(signaling, users) {
const newSessionIds = arrayDiff(currentUsersInRoom, previousUsersInRoom)
const disconnectedSessionIds = arrayDiff(previousUsersInRoom, currentUsersInRoom)
+ const unchangedSessionIds = arrayCommon(currentUsersInRoom, previousUsersInRoom)
const newUsers = []
newSessionIds.forEach(function(sessionId) {
newUsers.push(userMapping[sessionId])
})
- if (newUsers.length || disconnectedSessionIds.length) {
- usersChanged(signaling, newUsers, disconnectedSessionIds)
+ const changedPublishers = []
+ unchangedSessionIds.forEach(function(sessionId) {
+ const user = userMapping[sessionId]
+
+ if ((userHasStreams(user) && !userHasPeer(user))
+ || (!userHasStreams(user) && userHasPeer(user))) {
+ changedPublishers.push(user)
+ }
+ })
+ if (newUsers.length || disconnectedSessionIds.length || changedPublishers.length) {
+ usersChanged(signaling, newUsers, disconnectedSessionIds, changedPublishers)
}
}