diff --git a/differences.md b/differences.md index 829df24..05d61a5 100644 --- a/differences.md +++ b/differences.md @@ -12,7 +12,7 @@ |---------|:--:|:----:|-------| | NKey generation (server identity) | Y | Y | Ed25519 key pair via NATS.NKeys at startup | | System account setup | Y | Y | `$SYS` account created; no event publishing yet (stub) | -| Config file validation on startup | Y | Stub | `-c` flag parsed, `ConfigFile` stored, but no config parser | +| Config file validation on startup | Y | Y | Full config parsing with error collection via `ConfigProcessor` | | PID file writing | Y | Y | Written on startup, deleted on shutdown | | Profiling HTTP endpoint (`/debug/pprof`) | Y | Stub | `ProfPort` option exists but endpoint not implemented | | Ports file output | Y | Y | JSON ports file written to `PortsFileDir` on startup | @@ -42,7 +42,7 @@ | SIGTERM | Y | Y | `PosixSignalRegistration` triggers `ShutdownAsync()` | | SIGUSR1 (reopen logs) | Y | Y | SIGUSR1 handler calls ReOpenLogFile | | SIGUSR2 (lame duck mode) | Y | Y | Triggers `LameDuckShutdownAsync()` | -| SIGHUP (config reload) | Y | Stub | Signal registered, handler logs "not yet implemented" | +| SIGHUP (config reload) | Y | Y | Re-parses config, diffs options, applies reloadable subset; CLI flags preserved | | Windows Service integration | Y | N | | --- @@ -247,7 +247,7 @@ Go implements a sophisticated slow consumer detection system: | `-a/--addr` | Y | Y | | | `-n/--name` (ServerName) | Y | Y | | | `-m/--http_port` (monitoring) | Y | Y | | -| `-c` (config file) | Y | Stub | Flag parsed, stored in `ConfigFile`, no config parser | +| `-c` (config file) | Y | Y | Full config parsing: lexer → parser → processor; CLI args override config | | `-D/-V/-DV` (debug/trace) | Y | Y | `-D`/`--debug` for debug, `-V`/`-T`/`--trace` for trace, `-DV` for both | | `--tlscert/--tlskey/--tlscacert` | Y | Y | | | `--tlsverify` | Y | Y | | @@ -257,10 +257,10 @@ Go implements a sophisticated slow consumer detection system: ### Configuration System | Feature | Go | .NET | Notes | |---------|:--:|:----:|-------| -| Config file parsing | Y | N | Go has custom `conf` parser with includes | -| Hot reload (SIGHUP) | Y | N | | -| Config change detection | Y | N | Go tracks `inConfig`/`inCmdLine` origins | -| ~450 option fields | Y | ~62 | .NET covers core + debug/trace/logging/limits/tags options | +| Config file parsing | Y | Y | Custom NATS conf lexer/parser ported from Go; supports includes, variables, blocks | +| Hot reload (SIGHUP) | Y | Y | Reloads logging, auth, limits, TLS certs on SIGHUP; rejects non-reloadable changes | +| Config change detection | Y | Y | SHA256 digest comparison; `InCmdLine` tracks CLI flag precedence | +| ~450 option fields | Y | ~72 | .NET covers core + all single-server options; cluster/JetStream keys silently ignored | ### Missing Options Categories - ~~Logging options~~ — file logging, rotation, syslog, debug/trace, color, timestamps all implemented; only per-subsystem log control remains @@ -393,15 +393,13 @@ The following items from the original gap list have been implemented: - **Subscription statistics** — `Stats()`, `HasInterest()`, `NumInterest()`, etc. - **Per-account limits** — connection + subscription limits via `AccountConfig` - **Reply subject tracking** — `ResponseTracker` with TTL + max messages - -### Remaining High Priority -1. **Config file parsing** — needed for production deployment (CLI stub exists) -2. **Hot reload** — needed for zero-downtime config changes (SIGHUP stub exists) +- **Config file parsing** — custom lexer/parser ported from Go; supports includes, variables, nested blocks, size suffixes +- **Hot reload (SIGHUP)** — re-parses config, diffs changes, validates reloadable set, applies with CLI precedence ### Remaining Lower Priority -3. **Dynamic buffer sizing** — delegated to Pipe, less optimized for long-lived connections -4. **JWT authentication** — needed for operator mode -5. **OCSP support** — certificate revocation checking -6. **Subject mapping** — input→output subject transformation -7. **Windows Service integration** — needed for Windows deployment -8. **Per-subsystem log control** — granular log levels per component +1. **Dynamic buffer sizing** — delegated to Pipe, less optimized for long-lived connections +2. **JWT authentication** — needed for operator mode +3. **OCSP support** — certificate revocation checking +4. **Subject mapping** — input→output subject transformation +5. **Windows Service integration** — needed for Windows deployment +6. **Per-subsystem log control** — granular log levels per component