using System.Collections.Concurrent; using MxGateway.Contracts.Proto; namespace MxGateway.Server.Sessions; public sealed class SessionRegistry : ISessionRegistry { private readonly ConcurrentDictionary _sessions = new(StringComparer.Ordinal); public int Count => _sessions.Count; public int ActiveCount => _sessions.Values.Count(session => session.State is not SessionState.Closed); public bool TryAdd(GatewaySession session) { ArgumentNullException.ThrowIfNull(session); return _sessions.TryAdd(session.SessionId, session); } public bool TryGet( string sessionId, out GatewaySession session) { return _sessions.TryGetValue(sessionId, out session!); } public bool TryRemove( string sessionId, out GatewaySession session) { return _sessions.TryRemove(sessionId, out session!); } public IReadOnlyCollection Snapshot() { return _sessions.Values.ToArray(); } }