feat: add per-account connection/subscription limits with AccountConfig
This commit is contained in:
@@ -10,8 +10,11 @@ public sealed class Account : IDisposable
|
||||
public string Name { get; }
|
||||
public SubList SubList { get; } = new();
|
||||
public Permissions? DefaultPermissions { get; set; }
|
||||
public int MaxConnections { get; set; } // 0 = unlimited
|
||||
public int MaxSubscriptions { get; set; } // 0 = unlimited
|
||||
|
||||
private readonly ConcurrentDictionary<ulong, byte> _clients = new();
|
||||
private int _subscriptionCount;
|
||||
|
||||
public Account(string name)
|
||||
{
|
||||
@@ -19,10 +22,31 @@ public sealed class Account : IDisposable
|
||||
}
|
||||
|
||||
public int ClientCount => _clients.Count;
|
||||
public int SubscriptionCount => Volatile.Read(ref _subscriptionCount);
|
||||
|
||||
public void AddClient(ulong clientId) => _clients[clientId] = 0;
|
||||
/// <summary>Returns false if max connections exceeded.</summary>
|
||||
public bool AddClient(ulong clientId)
|
||||
{
|
||||
if (MaxConnections > 0 && _clients.Count >= MaxConnections)
|
||||
return false;
|
||||
_clients[clientId] = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void RemoveClient(ulong clientId) => _clients.TryRemove(clientId, out _);
|
||||
|
||||
public bool IncrementSubscriptions()
|
||||
{
|
||||
if (MaxSubscriptions > 0 && Volatile.Read(ref _subscriptionCount) >= MaxSubscriptions)
|
||||
return false;
|
||||
Interlocked.Increment(ref _subscriptionCount);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void DecrementSubscriptions()
|
||||
{
|
||||
Interlocked.Decrement(ref _subscriptionCount);
|
||||
}
|
||||
|
||||
public void Dispose() => SubList.Dispose();
|
||||
}
|
||||
|
||||
8
src/NATS.Server/Auth/AccountConfig.cs
Normal file
8
src/NATS.Server/Auth/AccountConfig.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace NATS.Server.Auth;
|
||||
|
||||
public sealed class AccountConfig
|
||||
{
|
||||
public int MaxConnections { get; init; } // 0 = unlimited
|
||||
public int MaxSubscriptions { get; init; } // 0 = unlimited
|
||||
public Permissions? DefaultPermissions { get; init; }
|
||||
}
|
||||
Reference in New Issue
Block a user