///<summary>Destroys alive websocket connections with the sessionId</summary> public static bool SearchAndDestroy(string sessionId) { if (sessionId is null) { return(false); } List <WebSocket> remove = new List <WebSocket>(); foreach (DictionaryEntry e in connections) { AliveEntry entry = (AliveEntry)e.Value; if (entry.session == sessionId) { remove.Add(entry.ws); if (entry.ws.State == WebSocketState.Open) { try { entry.ws.SendAsync(MSG_FORCE_RELOAD, WebSocketMessageType.Text, true, CancellationToken.None); } catch { } try { entry.ws.Abort(); } catch { } } } } for (int i = 0; i < remove.Count; i++) { connections.Remove(remove[i]); } remove.Clear(); return(true); }
public static void Broadcast(byte[] message) { List <WebSocket> remove = new List <WebSocket>(); foreach (DictionaryEntry e in connections) { AliveEntry entry = (AliveEntry)e.Value; if (!Session.acl.ContainsKey(entry.username)) { remove.Add(entry.ws); continue; } AccessControl ac = Session.acl[entry.username]; if (ac is null || ac.database == AccessControl.AccessLevel.Deny || ac.log == AccessControl.AccessLevel.Deny) //broadcast only to authorized users { continue; } if (entry.ws.State == WebSocketState.Open) { new Thread(() => { try { lock (entry.syncLock) entry.ws.SendAsync(new ArraySegment <byte>(message, 0, message.Length), WebSocketMessageType.Text, true, CancellationToken.None); } catch {} }).Start(); } else { remove.Add(entry.ws); } } for (int i = 0; i < remove.Count; i++) { connections.Remove(remove[i]); } }