feat: port session 10 — Server Core Runtime, Accept Loops & Listeners

Ports server/server.go lines 2577–4782 (~1,881 Go LOC), implementing ~97
features (IDs 3051–3147) across three new partial-class files.

New files:
- NatsServer.Lifecycle.cs: Shutdown, WaitForShutdown, RemoveClient,
  SendLDMToClients, LameDuckMode, LDMClientByID, rate-limit logging,
  DisconnectClientByID, SendAsyncInfoToClients
- NatsServer.Listeners.cs: AcceptLoop, GetServerListener, InProcessConn,
  AcceptConnections, GenerateInfoJson, CopyInfo, CreateClient/Ex/InProcess,
  StartMonitoring (HTTP/HTTPS), AddConnectURLs/RemoveConnectURLs,
  TlsVersion/TlsVersionFromString, GetClientConnectURLs, ResolveHostPorts,
  PortsInfo/PortFile/LogPorts, ReadyForListeners, GetRandomIP, AcceptError
- Internal/WaitGroup.cs: Go-style WaitGroup using TaskCompletionSource

Modified:
- Auth/AuthTypes.cs: Account now implements INatsAccount (stub)
- NatsServerTypes.cs: ServerInfo.ShallowClone(), removed duplicate RefCountedUrlSet
- NatsServer.cs: _info promoted to internal for test access
- Properties/AssemblyInfo.cs: InternalsVisibleTo(DynamicProxyGenAssembly2)
- ServerTests.cs: 20 new session-10 unit tests (GenerateInfoJson, TlsVersion,
  CopyInfo, GetRandomIP — Test IDs 2895, 2906)

All 565 unit tests + 1 integration test pass.
This commit is contained in:
Joseph Doherty
2026-02-26 15:08:23 -05:00
parent 0df93c23b0
commit 06779a1f77
13 changed files with 2539 additions and 21 deletions

View File

@@ -882,15 +882,26 @@ public sealed partial class NatsServer
// =========================================================================
/// <summary>
/// Sets the INFO host/port from the current listener endpoint.
/// Full implementation in session 10 (listener startup).
/// Stub sets to opts values.
/// Sets the INFO host/port from either <c>ClientAdvertise</c> or the bind options.
/// Mirrors Go <c>Server.setInfoHostPort()</c>.
/// Returns non-null on parse error.
/// </summary>
internal void SetInfoHostPort()
internal Exception? SetInfoHostPort()
{
var opts = GetOpts();
_info.Host = opts.Host;
_info.Port = opts.Port;
if (!string.IsNullOrEmpty(opts.ClientAdvertise))
{
var (h, p, err) = Internal.ServerUtilities.ParseHostPort(opts.ClientAdvertise, opts.Port);
if (err != null) return err;
_info.Host = h;
_info.Port = p;
}
else
{
_info.Host = opts.Host;
_info.Port = opts.Port;
}
return null;
}
/// <summary>