GUACAMOLE-1293: Add "onjoin" and "onleave" events as alternative to handling low-level "msg" instructions directly.

This commit is contained in:
Mike Jumper
2023-01-29 08:15:20 -08:00
parent 250039aaf9
commit a0d5824e83
2 changed files with 72 additions and 34 deletions

View File

@@ -703,6 +703,40 @@ Guacamole.Client = function(tunnel) {
*/ */
this.onmsg = null; this.onmsg = null;
/**
* Fired when a user joins a shared connection.
*
* @event
* @param {!string} userID
* A unique value representing this specific user's connection to the
* shared connection. This value is generated by the server and is
* guaranteed to be unique relative to other users of the connection.
*
* @param {!string} name
* A human-readable name representing the user that joined, such as
* their username. This value is provided by the web application during
* the connection handshake and is not necessarily unique relative to
* other users of the connection.
*/
this.onjoin = null;
/**
* Fired when a user leaves a shared connection.
*
* @event
* @param {!string} userID
* A unique value representing this specific user's connection to the
* shared connection. This value is generated by the server and is
* guaranteed to be unique relative to other users of the connection.
*
* @param {!string} name
* A human-readable name representing the user that left, such as their
* username. This value is provided by the web application during the
* connection handshake and is not necessarily unique relative to other
* users of the connection.
*/
this.onleave = null;
/** /**
* Fired when a audio stream is created. The stream provided to this event * Fired when a audio stream is created. The stream provided to this event
* handler will contain its own event handlers for received data. * handler will contain its own event handlers for received data.
@@ -1416,8 +1450,24 @@ Guacamole.Client = function(tunnel) {
}, },
"msg" : function(parameters) { "msg" : function(parameters) {
if (guac_client.onmsg) guac_client.onmsg(parseInt(parameters[0]), parameters.slice(1)); var msgid = parseInt(parameters[0]);
if (guac_client.onmsg)
guac_client.onmsg(msgid, parameters.slice(1));
switch (msgid) {
case Guacamole.Client.Message.USER_JOINED:
if (guac_client.onjoin)
guac_client.onjoin(parameters[1] /* User ID */, parameters[2] /* Name */);
break;
case Guacamole.Client.Message.USER_LEFT:
if (guac_client.onleave)
guac_client.onleave(parameters[1] /* User ID */, parameters[2] /* Name */);
break;
}
}, },

View File

@@ -507,47 +507,35 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
}); });
}; };
// Handle messages received from guacd to display to the client.
client.onmsg = function clientMessage(msgcode, args) {
switch (msgcode) {
// Update current users on connection when a user joins/leaves // Update user count when a new user joins
case Guacamole.Client.Message.USER_JOINED: client.onjoin = function userJoined(id, username) {
case Guacamole.Client.Message.USER_LEFT: $rootScope.$apply(function usersChanged() {
var userID = args[0]; var connections = managedClient.users[username] || {};
var username = args[1]; managedClient.users[username] = connections;
var connections = managedClient.users[username] || {}; managedClient.userCount++;
managedClient.users[username] = connections; connections[id] = true;
$rootScope.$apply(function usersChanged() { });
};
// Add/remove user // Update user count when a user leaves
if (msgcode === Guacamole.Client.Message.USER_JOINED) { client.onleave = function userLeft(id, username) {
managedClient.userCount++; $rootScope.$apply(function usersChanged() {
connections[userID] = true;
}
else {
managedClient.userCount--;
delete connections[userID];
}
// Delete user entry after no connections remain var connections = managedClient.users[username] || {};
if (_.isEmpty(connections)) managedClient.users[username] = connections;
delete managedClient.users[username];
}); managedClient.userCount--;
delete connections[id];
break; // Delete user entry after no connections remain
if (_.isEmpty(connections))
delete managedClient.users[username];
default: });
// Ignore - we only handle join/leave messages, which are
// currently the only messages defined at the protocol
// level.
}
}; };
// Automatically update the client thumbnail // Automatically update the client thumbnail