40 lines
1.0 KiB
C#
40 lines
1.0 KiB
C#
using System.Collections.Concurrent;
|
|
using MxGateway.Contracts.Proto;
|
|
|
|
namespace MxGateway.Server.Sessions;
|
|
|
|
public sealed class SessionRegistry : ISessionRegistry
|
|
{
|
|
private readonly ConcurrentDictionary<string, GatewaySession> _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<GatewaySession> Snapshot()
|
|
{
|
|
return _sessions.Values.ToArray();
|
|
}
|
|
}
|