removed accumulating duplicate/stale WebSocket entries over time

This commit is contained in:
Yinyin Liu 2026-03-05 09:17:06 +01:00
parent 4ac1bc78ab
commit 534b00aeb8
1 changed files with 28 additions and 19 deletions

View File

@ -69,6 +69,9 @@ public static class WebsocketManager
var installationConnection = InstallationConnections[installationId]; var installationConnection = InstallationConnections[installationId];
Console.WriteLine("Update all the connected websockets for installation " + installation.Name); Console.WriteLine("Update all the connected websockets for installation " + installation.Name);
// Prune dead/closed connections before sending
installationConnection.Connections.RemoveAll(c => c.State != WebSocketState.Open);
var jsonObject = new var jsonObject = new
{ {
id = installationId, id = installationId,
@ -82,9 +85,7 @@ public static class WebsocketManager
// Send to all connections concurrently (preserves original fire-and-forget intent), // Send to all connections concurrently (preserves original fire-and-forget intent),
// but isolate failures so one closed socket doesn't affect others or crash the caller. // but isolate failures so one closed socket doesn't affect others or crash the caller.
await Task.WhenAll(connections await Task.WhenAll(connections.Select(async c =>
.Where(c => c.State == WebSocketState.Open)
.Select(async c =>
{ {
try try
{ {
@ -163,7 +164,10 @@ public static class WebsocketManager
}; };
} }
if (!InstallationConnections[installationId].Connections.Contains(currentWebSocket))
{
InstallationConnections[installationId].Connections.Add(currentWebSocket); InstallationConnections[installationId].Connections.Add(currentWebSocket);
}
var jsonObject = new WebsocketMessage var jsonObject = new WebsocketMessage
{ {
@ -197,13 +201,9 @@ public static class WebsocketManager
lock (InstallationConnections) lock (InstallationConnections)
{ {
//When the front-end terminates the connection, the following code will be executed //When the front-end terminates the connection, the following code will be executed
//Console.WriteLine("The connection has been terminated");
foreach (var installationConnection in InstallationConnections) foreach (var installationConnection in InstallationConnections)
{ {
if (installationConnection.Value.Connections.Contains(currentWebSocket)) installationConnection.Value.Connections.RemoveAll(ws => ws == currentWebSocket);
{
installationConnection.Value.Connections.Remove(currentWebSocket);
}
} }
} }
@ -224,6 +224,15 @@ public static class WebsocketManager
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("WebSocket error: " + ex.Message); Console.WriteLine("WebSocket error: " + ex.Message);
// Ensure stale socket is removed even on unexpected errors
lock (InstallationConnections)
{
foreach (var installationConnection in InstallationConnections)
{
installationConnection.Value.Connections.RemoveAll(ws => ws == currentWebSocket);
}
}
} }
} }