using NATS.Server.Auth; using NATS.Server.Protocol; using NATS.Server.Subscriptions; namespace NATS.Server; /// /// Lightweight socketless client for internal messaging (SYSTEM, ACCOUNT, JETSTREAM). /// Maps to Go's internal client created by createInternalClient() in server.go:1910-1936. /// No network I/O — messages are delivered via callback. /// public sealed class InternalClient : INatsClient { public ulong Id { get; } public ClientKind Kind { get; } public bool IsInternal => Kind.IsInternal(); public Account? Account { get; } public ClientOptions? ClientOpts => null; public ClientPermissions? Permissions => null; /// /// Callback invoked when a message is delivered to this internal client. /// Set by the event system or account import infrastructure. /// public Action, ReadOnlyMemory>? MessageCallback { get; set; } private readonly Dictionary _subs = new(StringComparer.Ordinal); public InternalClient(ulong id, ClientKind kind, Account account) { if (!kind.IsInternal()) throw new ArgumentException($"InternalClient requires an internal ClientKind, got {kind}", nameof(kind)); Id = id; Kind = kind; Account = account; } public void SendMessage(string subject, string sid, string? replyTo, ReadOnlyMemory headers, ReadOnlyMemory payload) { MessageCallback?.Invoke(subject, sid, replyTo, headers, payload); } public bool QueueOutbound(ReadOnlyMemory data) => true; // no-op for internal clients public void RemoveSubscription(string sid) { if (_subs.Remove(sid)) Account?.DecrementSubscriptions(); } public void AddSubscription(Subscription sub) { _subs[sub.Sid] = sub; } public IReadOnlyDictionary Subscriptions => _subs; }