From f952e6afaba60280fba63436b13343a56beee02b Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 23 Feb 2026 04:23:27 -0500 Subject: [PATCH] feat: add new NatsOptions fields for Go config parity Adds 10 new fields to NatsOptions (ClientAdvertise, TraceVerbose, MaxTracedMsgLen, DisableSublistCache, ConnectErrorReports, ReconnectErrorReports, NoHeaderSupport, MaxClosedClients, NoSystemAccount, SystemAccount) plus InCmdLine tracking set. Moves MaxClosedClients from a private constant in NatsServer to a configurable option. --- src/NATS.Server/NatsOptions.cs | 15 +++++++++++++++ src/NATS.Server/NatsServer.cs | 3 +-- tests/NATS.Server.Tests/NatsOptionsTests.cs | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/NATS.Server/NatsOptions.cs b/src/NATS.Server/NatsOptions.cs index 8a9b56d..688a23f 100644 --- a/src/NATS.Server/NatsOptions.cs +++ b/src/NATS.Server/NatsOptions.cs @@ -71,6 +71,21 @@ public sealed class NatsOptions // Profiling (0 = disabled) public int ProfPort { get; set; } + // Extended options for Go parity + public string? ClientAdvertise { get; set; } + public bool TraceVerbose { get; set; } + public int MaxTracedMsgLen { get; set; } + public bool DisableSublistCache { get; set; } + public int ConnectErrorReports { get; set; } = 3600; + public int ReconnectErrorReports { get; set; } = 1; + public bool NoHeaderSupport { get; set; } + public int MaxClosedClients { get; set; } = 10_000; + public bool NoSystemAccount { get; set; } + public string? SystemAccount { get; set; } + + // Tracks which fields were set via CLI flags (for reload precedence) + public HashSet InCmdLine { get; } = []; + // TLS public string? TlsCert { get; set; } public string? TlsKey { get; set; } diff --git a/src/NATS.Server/NatsServer.cs b/src/NATS.Server/NatsServer.cs index 02a0734..e6ac3dd 100644 --- a/src/NATS.Server/NatsServer.cs +++ b/src/NATS.Server/NatsServer.cs @@ -20,7 +20,6 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable private readonly NatsOptions _options; private readonly ConcurrentDictionary _clients = new(); private readonly ConcurrentQueue _closedClients = new(); - private const int MaxClosedClients = 10_000; private readonly ServerInfo _serverInfo; private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; @@ -647,7 +646,7 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable }); // Cap closed clients list - while (_closedClients.Count > MaxClosedClients) + while (_closedClients.Count > _options.MaxClosedClients) _closedClients.TryDequeue(out _); var subList = client.Account?.SubList ?? _globalAccount.SubList; diff --git a/tests/NATS.Server.Tests/NatsOptionsTests.cs b/tests/NATS.Server.Tests/NatsOptionsTests.cs index 4e57769..e13d34c 100644 --- a/tests/NATS.Server.Tests/NatsOptionsTests.cs +++ b/tests/NATS.Server.Tests/NatsOptionsTests.cs @@ -14,4 +14,20 @@ public class NatsOptionsTests opts.LogSizeLimit.ShouldBe(0L); opts.Tags.ShouldBeNull(); } + + [Fact] + public void New_fields_have_correct_defaults() + { + var opts = new NatsOptions(); + opts.ClientAdvertise.ShouldBeNull(); + opts.TraceVerbose.ShouldBeFalse(); + opts.MaxTracedMsgLen.ShouldBe(0); + opts.DisableSublistCache.ShouldBeFalse(); + opts.ConnectErrorReports.ShouldBe(3600); + opts.ReconnectErrorReports.ShouldBe(1); + opts.NoHeaderSupport.ShouldBeFalse(); + opts.MaxClosedClients.ShouldBe(10_000); + opts.NoSystemAccount.ShouldBeFalse(); + opts.SystemAccount.ShouldBeNull(); + } }