feat: add Account type with per-account SubList and client tracking
This commit is contained in:
28
src/NATS.Server/Auth/Account.cs
Normal file
28
src/NATS.Server/Auth/Account.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using System.Collections.Concurrent;
|
||||||
|
using NATS.Server.Subscriptions;
|
||||||
|
|
||||||
|
namespace NATS.Server.Auth;
|
||||||
|
|
||||||
|
public sealed class Account : IDisposable
|
||||||
|
{
|
||||||
|
public const string GlobalAccountName = "$G";
|
||||||
|
|
||||||
|
public string Name { get; }
|
||||||
|
public SubList SubList { get; } = new();
|
||||||
|
public Permissions? DefaultPermissions { get; set; }
|
||||||
|
|
||||||
|
private readonly ConcurrentDictionary<ulong, byte> _clients = new();
|
||||||
|
|
||||||
|
public Account(string name)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ClientCount => _clients.Count;
|
||||||
|
|
||||||
|
public void AddClient(ulong clientId) => _clients[clientId] = 0;
|
||||||
|
|
||||||
|
public void RemoveClient(ulong clientId) => _clients.TryRemove(clientId, out _);
|
||||||
|
|
||||||
|
public void Dispose() => SubList.Dispose();
|
||||||
|
}
|
||||||
35
tests/NATS.Server.Tests/AccountTests.cs
Normal file
35
tests/NATS.Server.Tests/AccountTests.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using NATS.Server.Auth;
|
||||||
|
using NATS.Server.Subscriptions;
|
||||||
|
|
||||||
|
namespace NATS.Server.Tests;
|
||||||
|
|
||||||
|
public class AccountTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Account_has_name_and_own_sublist()
|
||||||
|
{
|
||||||
|
var account = new Account("test-account");
|
||||||
|
|
||||||
|
account.Name.ShouldBe("test-account");
|
||||||
|
account.SubList.ShouldNotBeNull();
|
||||||
|
account.SubList.Count.ShouldBe(0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Account_tracks_clients()
|
||||||
|
{
|
||||||
|
var account = new Account("test");
|
||||||
|
|
||||||
|
account.ClientCount.ShouldBe(0);
|
||||||
|
account.AddClient(1);
|
||||||
|
account.ClientCount.ShouldBe(1);
|
||||||
|
account.RemoveClient(1);
|
||||||
|
account.ClientCount.ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GlobalAccount_has_default_name()
|
||||||
|
{
|
||||||
|
Account.GlobalAccountName.ShouldBe("$G");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user