diff --git a/src/NATS.Server/INatsClient.cs b/src/NATS.Server/INatsClient.cs new file mode 100644 index 0000000..5b3e714 --- /dev/null +++ b/src/NATS.Server/INatsClient.cs @@ -0,0 +1,19 @@ +using NATS.Server.Auth; +using NATS.Server.Protocol; + +namespace NATS.Server; + +public interface INatsClient +{ + ulong Id { get; } + ClientKind Kind { get; } + bool IsInternal => Kind.IsInternal(); + Account? Account { get; } + ClientOptions? ClientOpts { get; } + ClientPermissions? Permissions { get; } + + void SendMessage(string subject, string sid, string? replyTo, + ReadOnlyMemory headers, ReadOnlyMemory payload); + bool QueueOutbound(ReadOnlyMemory data); + void RemoveSubscription(string sid); +} diff --git a/src/NATS.Server/NatsClient.cs b/src/NATS.Server/NatsClient.cs index 5a7e2c8..03029e5 100644 --- a/src/NATS.Server/NatsClient.cs +++ b/src/NATS.Server/NatsClient.cs @@ -26,7 +26,7 @@ public interface ISubListAccess SubList SubList { get; } } -public sealed class NatsClient : IDisposable +public sealed class NatsClient : INatsClient, IDisposable { private readonly Socket _socket; private readonly Stream _stream; @@ -45,6 +45,7 @@ public sealed class NatsClient : IDisposable private readonly ServerStats _serverStats; public ulong Id { get; } + public ClientKind Kind => ClientKind.Client; public ClientOptions? ClientOpts { get; private set; } public IMessageRouter? Router { get; set; } public Account? Account { get; private set; } diff --git a/src/NATS.Server/Subscriptions/Subscription.cs b/src/NATS.Server/Subscriptions/Subscription.cs index d96095b..0a13604 100644 --- a/src/NATS.Server/Subscriptions/Subscription.cs +++ b/src/NATS.Server/Subscriptions/Subscription.cs @@ -9,5 +9,5 @@ public sealed class Subscription public required string Sid { get; init; } public long MessageCount; // Interlocked public long MaxMessages; // 0 = unlimited - public NatsClient? Client { get; set; } + public INatsClient? Client { get; set; } } diff --git a/tests/NATS.Server.Tests/InternalClientTests.cs b/tests/NATS.Server.Tests/InternalClientTests.cs index 7fb52a7..bbfa024 100644 --- a/tests/NATS.Server.Tests/InternalClientTests.cs +++ b/tests/NATS.Server.Tests/InternalClientTests.cs @@ -14,4 +14,16 @@ public class InternalClientTests { kind.IsInternal().ShouldBe(expected); } + + [Fact] + public void NatsClient_implements_INatsClient() + { + typeof(NatsClient).GetInterfaces().ShouldContain(typeof(INatsClient)); + } + + [Fact] + public void NatsClient_kind_is_Client() + { + typeof(NatsClient).GetProperty("Kind")!.PropertyType.ShouldBe(typeof(ClientKind)); + } }