feat: unique client IDs for direct server

When multiple UI applications were connecting using the same token, the actual websocket connection was getting lost, and could eventually be garbage-collected, leading to odd behavior from the UI. This is due to an existing client getting replaced and a reference to it lost. This has now been remedied, with each client getting a unique instance with a unique client ID.
This commit is contained in:
Andrew Welker
2025-07-10 10:36:47 -05:00
parent 5ff587a8c9
commit 8b098aac2c
12 changed files with 345 additions and 285 deletions

View File

@@ -1,18 +1,18 @@
using Newtonsoft.Json;
using System;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PepperDash.Core;
using PepperDash.Essentials.AppServer.Messengers;
using PepperDash.Essentials.RoomBridges;
using Serilog.Events;
using System;
using System.Text.RegularExpressions;
using WebSocketSharp;
using WebSocketSharp.Server;
using ErrorEventArgs = WebSocketSharp.ErrorEventArgs;
namespace PepperDash.Essentials.WebSocketServer
{
{
/// <summary>
/// Represents the behaviour to associate with a UiClient for WebSocket communication
/// </summary>
@@ -22,7 +22,10 @@ namespace PepperDash.Essentials.WebSocketServer
public string RoomKey { get; set; }
private string _clientId;
public string ClientId
{
get; private set;
}
private DateTime _connectionTime;
@@ -41,9 +44,9 @@ namespace PepperDash.Essentials.WebSocketServer
}
}
public UiClient()
public UiClient(string clientId)
{
ClientId = clientId;
}
protected override void OnOpen()
@@ -61,8 +64,7 @@ namespace PepperDash.Essentials.WebSocketServer
return;
}
var clientId = match.Groups[1].Value;
_clientId = clientId;
var clientId = ClientId;
if (Controller == null)
{
@@ -96,7 +98,7 @@ namespace PepperDash.Essentials.WebSocketServer
private void Bridge_UserCodeChanged(object sender, EventArgs e)
{
SendUserCodeToClient((MobileControlEssentialsRoomBridge)sender, _clientId);
SendUserCodeToClient((MobileControlEssentialsRoomBridge)sender, ClientId);
}
private void SendUserCodeToClient(MobileControlBridgeBase bridge, string clientId)