- Fix pull consumer fetch: send original stream subject in HMSG (not inbox) so NATS client distinguishes data messages from control messages - Fix MaxAge expiry: add background timer in StreamManager for periodic pruning - Fix JetStream wire format: Go-compatible anonymous objects with string enums, proper offset-based pagination for stream/consumer list APIs - Add 42 E2E black-box tests (core messaging, auth, TLS, accounts, JetStream) - Add ~1000 parity tests across all subsystems (gaps closure) - Update gap inventory docs to reflect implementation status
45 KiB
45 KiB
Events — Gap Analysis
This file tracks what has and hasn't been ported from Go to .NET for the Events module. See stillmissing.md for the full LOC comparison across all modules.
LLM Instructions: How to Analyze This Category
Step 1: Read the Go Reference Files
Read each Go source file listed below. For every file:
- Extract all exported types (structs, interfaces, type aliases)
- Extract all exported methods on those types (receiver functions)
- Extract all exported standalone functions
- Note key constants, enums, and protocol states
- Note important unexported helpers that implement core logic (functions >20 lines)
- Pay attention to concurrency patterns (goroutines, mutexes, channels) — these map to different .NET patterns
Step 2: Read the .NET Implementation Files
Read all .cs files in the .NET directories listed below. For each Go symbol found in Step 1:
- Search for a matching type, method, or function in .NET
- If found, compare the behavior: does it handle the same edge cases? Same error paths?
- If partially implemented, note what's missing
- If not found, note it as MISSING
Step 3: Cross-Reference Tests
Compare Go test functions against .NET test methods:
- For each Go
Test*function, check if a corresponding .NET[Fact]or[Theory]exists - Note which test scenarios are covered and which are missing
- Check the parity DB (
docs/test_parity.db) for existing mappings:sqlite3 docs/test_parity.db "SELECT go_test, dotnet_test, confidence FROM test_mappings tm JOIN go_tests gt ON tm.go_test_id=gt.rowid JOIN dotnet_tests dt ON tm.dotnet_test_id=dt.rowid WHERE gt.go_file LIKE '%PATTERN%'"
Step 4: Classify Each Item
Use these status values:
| Status | Meaning |
|---|---|
| PORTED | Equivalent exists in .NET with matching behavior |
| PARTIAL | .NET implementation exists but is incomplete (missing edge cases, error handling, or features) |
| MISSING | No .NET equivalent found — needs to be ported |
| NOT_APPLICABLE | Go-specific pattern that doesn't apply to .NET (build tags, platform-specific goroutine tricks, etc.) |
| DEFERRED | Intentionally skipped for now (document why) |
Step 5: Fill In the Gap Inventory
Add rows to the Gap Inventory table below. Group by Go source file. Include the Go file and line number so a porting LLM can jump directly to the reference implementation.
Key Porting Notes for Events
- System events publish on
$SYS.ACCOUNT.<id>.CONNECT,$SYS.ACCOUNT.<id>.DISCONNECT, etc. - Events include client info, server info, and reason codes.
- Message tracing allows tracking a specific message through local delivery, routes, gateways, and leaf nodes.
- The system account (
$SYS) is used for internal server communication.
Go Reference Files (Source)
golang/nats-server/server/events.go— System event generation/publishing (~4,080 lines). Connect/disconnect events, auth events, account events. Publishes on$SYS.subjects.golang/nats-server/server/msgtrace.go— Message tracing (trace a message through the system)
Go Reference Files (Tests)
golang/nats-server/server/events_test.gogolang/nats-server/server/msgtrace_test.go
.NET Implementation Files (Source)
src/NATS.Server/Events/(all files)
.NET Implementation Files (Tests)
tests/NATS.Server.Tests/Events/
Gap Inventory
events.go — Exported Types / Structs
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
TypedEvent |
golang/nats-server/server/events.go:468 |
PORTED | src/NATS.Server/Events/EventTypes.cs |
Fields inlined directly into each event class (ConnectEventMsg, DisconnectEventMsg, etc.) rather than embedded; same JSON shape |
ServerStatsMsg |
golang/nats-server/server/events.go:150 |
PORTED | src/NATS.Server/Events/EventTypes.cs:383 |
Full field parity |
ConnectEventMsg |
golang/nats-server/server/events.go:155 |
PORTED | src/NATS.Server/Events/EventTypes.cs:191 |
Full field parity including schema type constant |
DisconnectEventMsg |
golang/nats-server/server/events.go:167 |
PORTED | src/NATS.Server/Events/EventTypes.cs:211 |
Full field parity including schema type constant |
OCSPPeerRejectEventMsg |
golang/nats-server/server/events.go:182 |
PORTED | src/NATS.Server/Events/EventTypes.cs:570 |
Added Peer CertInfo payload parity (subject/issuer/fingerprint/raw) while preserving existing advisory fields |
OCSPPeerChainlinkInvalidEventMsg |
golang/nats-server/server/events.go:196 |
PORTED | src/NATS.Server/Events/EventTypes.cs:624 |
Added dedicated parity DTO with link + peer cert info and matching advisory type string |
AccountNumConns |
golang/nats-server/server/events.go:210 |
PORTED | src/NATS.Server/Events/EventTypes.cs:245 |
Full field parity including schema type constant |
AccountStat |
golang/nats-server/server/events.go:217 |
PORTED | src/NATS.Server/Events/EventTypes.cs:245 |
Fields embedded inline in AccountNumConns — matches Go embedding pattern |
ServerInfo |
golang/nats-server/server/events.go:249 |
PORTED | src/NATS.Server/Events/EventTypes.cs:9 |
EventServerInfo — all fields present; Flags typed as ulong (Go ServerCapability uint64) |
ServerID |
golang/nats-server/server/events.go:239 |
PORTED | src/NATS.Server/Events/EventTypes.cs:22 |
Added ServerID DTO with name/host/id JSON fields for IDZ-style responses |
ServerCapability (type + consts) |
golang/nats-server/server/events.go:246 |
PORTED | src/NATS.Server/Events/EventTypes.cs:10 |
Added [Flags] ServerCapability enum with JetStreamEnabled, BinaryStreamSnapshot, and AccountNRG bits |
ClientInfo |
golang/nats-server/server/events.go:308 |
PORTED | src/NATS.Server/Events/EventTypes.cs:62 |
EventClientInfo — all fields present; RTT stored as long RttNanos vs Go time.Duration |
ServerStats |
golang/nats-server/server/events.go:364 |
PORTED | src/NATS.Server/Events/EventTypes.cs:395 |
ServerStatsData — full field parity; .NET adds InMsgs/OutMsgs/InBytes/OutBytes compat fields not in Go (extra, not missing) |
RouteStat |
golang/nats-server/server/events.go:390 |
PORTED | src/NATS.Server/Events/EventTypes.cs:303 |
Full field parity |
GatewayStat |
golang/nats-server/server/events.go:398 |
PORTED | src/NATS.Server/Events/EventTypes.cs:326 |
Full field parity |
MsgBytes |
golang/nats-server/server/events.go:407 |
PORTED | src/NATS.Server/Events/EventTypes.cs:181 |
MsgBytesStats — same fields |
DataStats |
golang/nats-server/server/events.go:412 |
PORTED | src/NATS.Server/Events/EventTypes.cs:156 |
Full field parity |
EventFilterOptions |
golang/nats-server/server/events.go:1946 |
PORTED | src/NATS.Server/Events/EventTypes.cs:929 |
Added shared filter DTO with name/cluster/host/tags/domain fields |
StatszEventOptions |
golang/nats-server/server/events.go:1956 |
PORTED | src/NATS.Server/Events/EventTypes.cs:952 |
Added typed options wrapper inheriting EventFilterOptions |
AccInfoEventOptions |
golang/nats-server/server/events.go:1962 |
PORTED | src/NATS.Server/Events/EventTypes.cs:953 |
Added typed options wrapper inheriting EventFilterOptions |
ConnzEventOptions |
golang/nats-server/server/events.go:1968 |
PORTED | src/NATS.Server/Events/EventTypes.cs:954 |
Added typed options wrapper inheriting EventFilterOptions |
RoutezEventOptions |
golang/nats-server/server/events.go:1974 |
PORTED | src/NATS.Server/Events/EventTypes.cs:955 |
Added typed options wrapper inheriting EventFilterOptions |
SubszEventOptions |
golang/nats-server/server/events.go:1980 |
PORTED | src/NATS.Server/Events/EventTypes.cs:956 |
Added typed options wrapper inheriting EventFilterOptions |
VarzEventOptions |
golang/nats-server/server/events.go:1986 |
PORTED | src/NATS.Server/Events/EventTypes.cs:957 |
Added typed options wrapper inheriting EventFilterOptions |
GatewayzEventOptions |
golang/nats-server/server/events.go:1992 |
PORTED | src/NATS.Server/Events/EventTypes.cs:958 |
Added typed options wrapper inheriting EventFilterOptions |
LeafzEventOptions |
golang/nats-server/server/events.go:1997 |
PORTED | src/NATS.Server/Events/EventTypes.cs:959 |
Added typed options wrapper inheriting EventFilterOptions |
AccountzEventOptions |
golang/nats-server/server/events.go:2004 |
PORTED | src/NATS.Server/Events/EventTypes.cs:960 |
Added typed options wrapper inheriting EventFilterOptions |
AccountStatzEventOptions |
golang/nats-server/server/events.go:2010 |
PORTED | src/NATS.Server/Events/EventTypes.cs:961 |
Added typed options wrapper inheriting EventFilterOptions |
JszEventOptions |
golang/nats-server/server/events.go:2016 |
PORTED | src/NATS.Server/Events/EventTypes.cs:962 |
Added typed options wrapper inheriting EventFilterOptions |
HealthzEventOptions |
golang/nats-server/server/events.go:2022 |
PORTED | src/NATS.Server/Events/EventTypes.cs:963 |
Added typed options wrapper inheriting EventFilterOptions |
ProfilezEventOptions |
golang/nats-server/server/events.go:2028 |
PORTED | src/NATS.Server/Events/EventTypes.cs:964 |
Added typed options wrapper inheriting EventFilterOptions |
ExpvarzEventOptions |
golang/nats-server/server/events.go:2034 |
PORTED | src/NATS.Server/Events/EventTypes.cs:965 |
Added typed options wrapper inheriting EventFilterOptions |
IpqueueszEventOptions |
golang/nats-server/server/events.go:2039 |
PORTED | src/NATS.Server/Events/EventTypes.cs:966 |
Added typed options wrapper inheriting EventFilterOptions |
RaftzEventOptions |
golang/nats-server/server/events.go:2045 |
PORTED | src/NATS.Server/Events/EventTypes.cs:967 |
Added typed options wrapper inheriting EventFilterOptions |
ServerAPIResponse |
golang/nats-server/server/events.go:2092 |
PORTED | src/NATS.Server/Events/EventTypes.cs:988 |
Added generic request/reply envelope with server, data, and error payload |
ServerAPIConnzResponse |
golang/nats-server/server/events.go:2106 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1003 |
Added typed server API response wrapper |
ServerAPIRoutezResponse |
golang/nats-server/server/events.go:2113 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1004 |
Added typed server API response wrapper |
ServerAPIGatewayzResponse |
golang/nats-server/server/events.go:2119 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1005 |
Added typed server API response wrapper |
ServerAPIJszResponse |
golang/nats-server/server/events.go:2126 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1006 |
Added typed server API response wrapper |
ServerAPIHealthzResponse |
golang/nats-server/server/events.go:2133 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1007 |
Added typed server API response wrapper |
ServerAPIVarzResponse |
golang/nats-server/server/events.go:2141 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1008 |
Added typed server API response wrapper |
ServerAPISubszResponse |
golang/nats-server/server/events.go:2148 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1009 |
Added typed server API response wrapper |
ServerAPILeafzResponse |
golang/nats-server/server/events.go:2155 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1010 |
Added typed server API response wrapper |
ServerAPIAccountzResponse |
golang/nats-server/server/events.go:2162 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1011 |
Added typed server API response wrapper |
ServerAPIExpvarzResponse |
golang/nats-server/server/events.go:2169 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1012 |
Added typed server API response wrapper |
ServerAPIpqueueszResponse |
golang/nats-server/server/events.go:2175 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1013 |
Added typed server API response wrapper |
ServerAPIRaftzResponse |
golang/nats-server/server/events.go:2183 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1014 |
Added typed server API response wrapper |
KickClientReq |
golang/nats-server/server/events.go:3180 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1020 |
Added request DTO with cid payload field |
LDMClientReq |
golang/nats-server/server/events.go:3184 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1030 |
Added request DTO with cid payload field |
UserInfo |
golang/nats-server/server/events.go:1500 |
PORTED | src/NATS.Server/Events/EventTypes.cs:1040 |
Added direct user info DTO with user/account/permissions fields |
SlowConsumersStats |
golang/nats-server/server/events.go:377 |
PORTED | src/NATS.Server/Events/EventTypes.cs:344 |
Full field parity |
StaleConnectionStats |
golang/nats-server/server/events.go:379 |
PORTED | src/NATS.Server/Events/EventTypes.cs:363 |
Full field parity |
events.go — Unexported Types (Important Helpers)
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
internal struct |
golang/nats-server/server/events.go:124 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:83 |
InternalEventSystem class — same responsibilities: send/receive queues, sequence counter, SID counter, callback registry, server hash |
inSysMsg struct |
golang/nats-server/server/events.go:112 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:29 |
InternalSystemMessage sealed class — same fields |
pubMsg struct |
golang/nats-server/server/events.go:421 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:15 |
PublishMessage sealed class — same fields |
sysMsgHandler type |
golang/nats-server/server/events.go:109 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:67 |
SystemMessageHandler delegate — same signature shape |
serverUpdate struct |
golang/nats-server/server/events.go:461 |
MISSING | — | Tracks seq + ltime for remote server heartbeat ordering; no .NET equivalent |
accNumConnsReq struct |
golang/nats-server/server/events.go:233 |
PORTED | src/NATS.Server/Events/EventTypes.cs:797 |
AccNumConnsReq — full field parity |
accNumSubsReq struct |
golang/nats-server/server/events.go:2966 |
PORTED | src/NATS.Server/Events/EventTypes.cs:916 |
Added account subscription-count request DTO with server + account fields |
compressionType + consts |
golang/nats-server/server/events.go:2082 |
PORTED | src/NATS.Server/Events/EventCompressor.cs:13 |
Added EventCompressionType enum with None, Gzip, Snappy, and Unsupported; compressor now supports both Snappy and Gzip encode/decode paths. |
msgHandler type |
golang/nats-server/server/events.go:2751 |
NOT_APPLICABLE | — | Go internal callback type merging header+body bytes; .NET uses the SystemMessageHandler delegate with separate header/body params |
events.go — Exported Methods on ServerInfo
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
(*ServerInfo).SetJetStreamEnabled() |
golang/nats-server/server/events.go:274 |
PORTED | src/NATS.Server/Events/EventTypes.cs:86 |
Added helper to set JetStream and capability flag atomically for parity |
(*ServerInfo).JetStreamEnabled() bool |
golang/nats-server/server/events.go:281 |
PORTED | src/NATS.Server/Events/EventTypes.cs:92 |
Added flag-check helper using typed ServerCapability.JetStreamEnabled |
(*ServerInfo).SetBinaryStreamSnapshot() |
golang/nats-server/server/events.go:287 |
PORTED | src/NATS.Server/Events/EventTypes.cs:95 |
Added capability setter for binary stream snapshot support |
(*ServerInfo).BinaryStreamSnapshot() bool |
golang/nats-server/server/events.go:292 |
PORTED | src/NATS.Server/Events/EventTypes.cs:98 |
Added capability getter for binary stream snapshot support |
(*ServerInfo).SetAccountNRG() |
golang/nats-server/server/events.go:297 |
PORTED | src/NATS.Server/Events/EventTypes.cs:101 |
Added capability setter for account NRG support |
(*ServerInfo).AccountNRG() bool |
golang/nats-server/server/events.go:302 |
PORTED | src/NATS.Server/Events/EventTypes.cs:104 |
Added capability getter for account NRG support |
events.go — Unexported Methods on ClientInfo
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
(*ClientInfo).forAssignmentSnap() |
golang/nats-server/server/events.go:334 |
NOT_APPLICABLE | — | Internal helper for RAFT assignment snapshots; no JetStream clustering yet |
(*ClientInfo).forProposal() |
golang/nats-server/server/events.go:343 |
NOT_APPLICABLE | — | Internal helper for RAFT proposals; no JetStream clustering yet |
(*ClientInfo).forAdvisory() |
golang/nats-server/server/events.go:353 |
MISSING | — | Strips JWT/Alternates for JS advisory events; no .NET equivalent |
events.go — Server Methods (Core Event System)
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
(*Server).EventsEnabled() |
golang/nats-server/server/events.go:807 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:125 |
InternalEventSystem.Start() activates the system; no public boolean property equivalent on NatsServer |
(*Server).TrackedRemoteServers() |
golang/nats-server/server/events.go:821 |
MISSING | — | No .NET equivalent |
(*Server).Node() |
golang/nats-server/server/events.go:1157 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:103 |
ServerHash property computes SHA-256(8-char) server hash; not exposed as Node() on server |
(*Server).internalSendLoop() |
golang/nats-server/server/events.go:495 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:363 |
InternalSendLoopAsync — Channel-based; handles JSON serialization and SubList delivery |
(*Server).internalReceiveLoop() |
golang/nats-server/server/events.go:476 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:431 |
InternalReceiveLoopAsync — Channel-based dispatch |
(*Server).sendLDMShutdownEventLocked() |
golang/nats-server/server/events.go:674 |
MISSING | — | No .NET equivalent |
(*Server).sendShutdownEvent() |
golang/nats-server/server/events.go:684 |
MISSING | — | No .NET equivalent; LameDuckEventMsg / ShutdownEventMsg types exist but publishing method does not |
(*Server).sendInternalAccountMsg() |
golang/nats-server/server/events.go:703 |
MISSING | — | No .NET equivalent |
(*Server).sendInternalAccountMsgWithReply() |
golang/nats-server/server/events.go:708 |
MISSING | — | No .NET equivalent |
(*Server).sendInternalAccountSysMsg() |
golang/nats-server/server/events.go:732 |
MISSING | — | No .NET equivalent |
(*Server).sendInternalMsgLocked() |
golang/nats-server/server/events.go:750 |
MISSING | — | No .NET equivalent |
(*Server).sendInternalMsg() |
golang/nats-server/server/events.go:758 |
MISSING | — | No .NET equivalent |
(*Server).sendInternalResponse() |
golang/nats-server/server/events.go:766 |
MISSING | — | No .NET equivalent |
(*Server).initEventTracking() |
golang/nats-server/server/events.go:1172 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:150 |
InitEventTracking registers VARZ/HEALTHZ/SUBSZ/STATSZ/IDZ; missing: account-level services (CONNZ, LEAFZ, JSZ, STATZ, CONNS, INFO), latency tracking, reload/kick/LDM services, NSUBS, debug subscribers |
(*Server).sendStatsz() |
golang/nats-server/server/events.go:891 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:188 |
PublishServerStats() — publishes stats; missing: interest check before sending, gzip/snappy compression on response, JetStream stats section |
(*Server).limitStatsz() |
golang/nats-server/server/events.go:1068 |
MISSING | — | Rate-limit for statsz broadcasts; no .NET equivalent |
(*Server).heartbeatStatsz() |
golang/nats-server/server/events.go:1098 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:134 |
Periodic timer in Start() fires every 10s; Go ramps from 250ms to statsz interval |
(*Server).resetLastStatsz() |
golang/nats-server/server/events.go:1115 |
MISSING | — | No .NET equivalent |
(*Server).sendStatszUpdate() |
golang/nats-server/server/events.go:1119 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:188 |
Effectively PublishServerStats() |
(*Server).startStatszTimer() |
golang/nats-server/server/events.go:1124 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:134 |
Timer started in Start(); Go does exponential backoff ramp-up; .NET is fixed 10s interval |
(*Server).startRemoteServerSweepTimer() |
golang/nats-server/server/events.go:1133 |
MISSING | — | Orphan remote server sweep; no .NET equivalent |
(*Server).checkRemoteServers() |
golang/nats-server/server/events.go:832 |
MISSING | — | No .NET equivalent |
(*Server).updateServerUsage() |
golang/nats-server/server/events.go:848 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:193 |
CPU via Process.GetCurrentProcess(); Go uses pse.ProcUsage() for actual CPU%; .NET does not populate CPU |
(*Server).sendAccConnsUpdate() |
golang/nats-server/server/events.go:2407 |
MISSING | — | No .NET equivalent |
(*Server).accConnsUpdate() |
golang/nats-server/server/events.go:2506 |
MISSING | — | No .NET equivalent |
(*Server).nextEventID() |
golang/nats-server/server/events.go:2516 |
PARTIAL | src/NATS.Server/Events/EventTypes.cs:943 |
EventBuilder.GenerateEventId() uses Guid.NewGuid(); Go uses nuid (faster nano-ID generator) |
(*Server).accountConnectEvent() |
golang/nats-server/server/events.go:2522 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:322 |
Extended ConnectEventDetail and event mapping to include JWT/issuer/tags/name-tag/kind/client-type/MQTT client id parity fields |
(*Server).accountDisconnectEvent() |
golang/nats-server/server/events.go:2569 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:355 |
Extended DisconnectEventDetail and event mapping to include RTT + JWT/issuer/tags/name-tag/kind/client-type/MQTT client id parity fields |
(*Server).sendAuthErrorEvent() |
golang/nats-server/server/events.go:2631 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:277 |
SendAuthErrorEvent() exists; Go uses DisconnectEventMsg shape for auth errors (surprising but correct); .NET uses AuthErrorEventMsg with different schema type |
(*Server).sendAccountAuthErrorEvent() |
golang/nats-server/server/events.go:2690 |
MISSING | — | Account-level auth error event to account subject; no .NET equivalent |
(*Server).sendOCSPPeerRejectEvent() |
golang/nats-server/server/events.go:3267 |
PARTIAL | src/NATS.Server/Events/EventTypes.cs:612 |
OcspEventBuilder.BuildPeerReject() helper exists; no publishing method on server; missing Peer CertInfo payload |
(*Server).sendOCSPPeerChainlinkInvalidEvent() |
golang/nats-server/server/events.go:3300 |
MISSING | — | No .NET equivalent at all; OcspChainValidationEvent is a different/new type with non-matching Go advisory shape |
(*Server).filterRequest() |
golang/nats-server/server/events.go:2052 |
MISSING | — | Server-side filter by name/host/cluster/tags/domain for Z-endpoint requests; no .NET equivalent |
(*Server).zReq() |
golang/nats-server/server/events.go:2252 |
MISSING | — | Generic Z request handler (parse options, filter, call respf, encode response); no .NET equivalent |
(*Server).statszReq() |
golang/nats-server/server/events.go:2190 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:159 |
HandleStatszRequest registered but implementation thin — no filter options parsing |
(*Server).idzReq() |
golang/nats-server/server/events.go:2217 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:156 |
HandleIdzRequest registered; no implementation visible in analyzed files |
(*Server).remoteConnsUpdate() |
golang/nats-server/server/events.go:2283 |
MISSING | — | No .NET equivalent |
(*Server).remoteServerUpdate() |
golang/nats-server/server/events.go:1704 |
MISSING | — | No .NET equivalent |
(*Server).remoteServerShutdown() |
golang/nats-server/server/events.go:1665 |
MISSING | — | No .NET equivalent |
(*Server).updateRemoteServer() |
golang/nats-server/server/events.go:1763 |
MISSING | — | No .NET equivalent |
(*Server).processRemoteServerShutdown() |
golang/nats-server/server/events.go:1642 |
MISSING | — | No .NET equivalent |
(*Server).processNewServer() |
golang/nats-server/server/events.go:1781 |
MISSING | — | No .NET equivalent |
(*Server).updateNRGAccountStatus() |
golang/nats-server/server/events.go:1816 |
NOT_APPLICABLE | — | JetStream NRG (RAFT) account status; not yet ported |
(*Server).ensureGWsInterestOnlyForLeafNodes() |
golang/nats-server/server/events.go:1838 |
NOT_APPLICABLE | — | Gateway + leaf node coordination; not yet ported |
(*Server).shutdownEventing() |
golang/nats-server/server/events.go:1852 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:453 |
DisposeAsync() cancels loops and drains queues; missing: clearing accounts' eventing state, sending shutdown event before draining |
(*Server).connsRequest() |
golang/nats-server/server/events.go:1886 |
MISSING | — | No .NET equivalent |
(*Server).leafNodeConnected() |
golang/nats-server/server/events.go:1925 |
NOT_APPLICABLE | — | Leaf node gateway interest mode; not yet ported |
(*Server).addSystemAccountExports() |
golang/nats-server/server/events.go:1556 |
NOT_APPLICABLE | — | Multi-tenant account exports; not yet ported |
(*Server).registerSystemImports() |
golang/nats-server/server/events.go:2331 |
NOT_APPLICABLE | — | Multi-tenant account imports; not yet ported |
(*Server).registerSystemImportsForExisting() |
golang/nats-server/server/events.go:1532 |
NOT_APPLICABLE | — | Multi-tenant; not yet ported |
(*Server).enableAccountTracking() |
golang/nats-server/server/events.go:2366 |
MISSING | — | No .NET equivalent |
(*Server).sendLeafNodeConnect() |
golang/nats-server/server/events.go:2383 |
NOT_APPLICABLE | — | Leaf node; not yet ported |
(*Server).sendLeafNodeConnectMsg() |
golang/nats-server/server/events.go:2398 |
NOT_APPLICABLE | — | Leaf node; not yet ported |
(*Server).accountClaimUpdate() |
golang/nats-server/server/events.go:1608 |
NOT_APPLICABLE | — | JWT account claim update; not yet ported |
(*Server).userInfoReq() |
golang/nats-server/server/events.go:1508 |
MISSING | — | No .NET equivalent |
(*Server).debugSubscribers() |
golang/nats-server/server/events.go:3001 |
MISSING | — | No .NET equivalent |
(*Server).nsubsRequest() |
golang/nats-server/server/events.go:3129 |
MISSING | — | No .NET equivalent |
(*Server).reloadConfig() |
golang/nats-server/server/events.go:3168 |
MISSING | — | No .NET equivalent |
(*Server).kickClient() |
golang/nats-server/server/events.go:3188 |
MISSING | — | No .NET equivalent |
(*Server).ldmClient() |
golang/nats-server/server/events.go:3206 |
MISSING | — | No .NET equivalent |
(*Server).sysSubscribe() |
golang/nats-server/server/events.go:2796 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:231 |
SysSubscribe() — same purpose |
(*Server).sysSubscribeQ() |
golang/nats-server/server/events.go:2801 |
MISSING | — | Queue-group variant; no .NET equivalent |
(*Server).sysSubscribeInternal() |
golang/nats-server/server/events.go:2806 |
MISSING | — | Internal-only sub (no interest propagation); no .NET equivalent |
(*Server).systemSubscribe() |
golang/nats-server/server/events.go:2810 |
PARTIAL | src/NATS.Server/Events/InternalEventSystem.cs:231 |
SysSubscribe() combines subscribe + callback registration; Go version supports queue groups and internal-only flag |
(*Server).sysUnsubscribe() |
golang/nats-server/server/events.go:2842 |
MISSING | — | No .NET equivalent |
(*Server).inboxReply() |
golang/nats-server/server/events.go:2928 |
MISSING | — | WC inbox reply dispatcher; no .NET equivalent |
(*Server).newRespInbox() |
golang/nats-server/server/events.go:2953 |
MISSING | — | No .NET equivalent |
(*Server).remoteLatencyUpdate() |
golang/nats-server/server/events.go:2870 |
NOT_APPLICABLE | — | Service latency tracking; not yet ported |
(*Server).noInlineCallback() |
golang/nats-server/server/events.go:2760 |
NOT_APPLICABLE | — | Routes callback through recvq to avoid blocking route/GW threads; .NET Channel already provides this decoupling |
(*Server).noInlineCallbackStatsz() |
golang/nats-server/server/events.go:2766 |
NOT_APPLICABLE | — | Same — statsz queue variant |
(*Server).wrapChk() |
golang/nats-server/server/events.go:3253 |
NOT_APPLICABLE | — | Lock + eventsEnabled guard wrapper; idiom not needed in async .NET code |
(*Server).sameDomain() |
golang/nats-server/server/events.go:1660 |
MISSING | — | No .NET equivalent |
events.go — Standalone / Package-Level Functions
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
getHash() |
golang/nats-server/server/events.go:1141 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:118 |
SHA-256 8-char hash; same algorithm |
getHashSize() |
golang/nats-server/server/events.go:1146 |
PORTED | src/NATS.Server/Events/InternalEventSystem.cs:143 |
Added GetHashSize() and size-aware GetHash(string, int) helpers; constructor now uses them for server hash generation |
routeStat() |
golang/nats-server/server/events.go:859 |
NOT_APPLICABLE | — | Route stat collection; clustering not yet ported |
newPubMsg() |
golang/nats-server/server/events.go:435 |
NOT_APPLICABLE | — | Pool-based pubMsg factory; .NET uses PublishMessage record without pooling |
(*pubMsg).returnToPool() |
golang/nats-server/server/events.go:452 |
NOT_APPLICABLE | — | Pool return; .NET has no pool |
accForClient() |
golang/nats-server/server/events.go:3224 |
MISSING | — | No .NET equivalent |
issuerForClient() |
golang/nats-server/server/events.go:3232 |
MISSING | — | No .NET equivalent |
clearTimer() |
golang/nats-server/server/events.go:3244 |
NOT_APPLICABLE | — | Go timer management idiom; .NET uses PeriodicTimer / CancellationToken |
totalSubs() |
golang/nats-server/server/events.go:2973 |
MISSING | — | No .NET equivalent |
remoteLatencySubjectForResponse() |
golang/nats-server/server/events.go:2860 |
NOT_APPLICABLE | — | Latency tracking; not yet ported |
getAcceptEncoding() |
golang/nats-server/server/events.go:2238 |
PORTED | src/NATS.Server/Events/EventCompressor.cs:192 |
Added EventCompressor.GetAcceptEncoding(string?) parser: prefers snappy/s2, falls back to gzip, otherwise unsupported, matching Go behavior. |
(*Account).statz() |
golang/nats-server/server/events.go:2446 |
NOT_APPLICABLE | — | Account stats snapshot; Account class not yet in Events module |
events.go — Constants / Subjects
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
connectEventSubj |
golang/nats-server/server/events.go:49 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:13 |
ConnectEvent — matching subject pattern |
disconnectEventSubj |
golang/nats-server/server/events.go:50 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:14 |
DisconnectEvent — matching |
accConnsEventSubjNew |
golang/nats-server/server/events.go:58 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:15 |
AccountConnsNew — matching |
accConnsEventSubjOld |
golang/nats-server/server/events.go:59 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:16 |
AccountConnsOld — matching |
serverStatsSubj |
golang/nats-server/server/events.go:66 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:19 |
ServerStats — matching |
shutdownEventSubj |
golang/nats-server/server/events.go:61 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:20 |
ServerShutdown — matching |
lameDuckEventSubj |
golang/nats-server/server/events.go:60 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:21 |
ServerLameDuck — matching |
authErrorEventSubj |
golang/nats-server/server/events.go:64 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:22 |
AuthError — matching |
authErrorAccountEventSubj |
golang/nats-server/server/events.go:65 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:23 |
AuthErrorAccount — matching |
serverDirectReqSubj |
golang/nats-server/server/events.go:67 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:32 |
ServerReq — matching |
serverPingReqSubj |
golang/nats-server/server/events.go:68 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:35 |
ServerPing — matching |
accDirectReqSubj |
golang/nats-server/server/events.go:51 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:38 |
AccountReq — matching |
inboxRespSubj |
golang/nats-server/server/events.go:73 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:41 |
InboxResponse — matching |
ocspPeerRejectEventSubj |
golang/nats-server/server/events.go:95 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:54 |
Corrected to $SYS.SERVER.{0}.OCSP.PEER.CONN.REJECT |
ocspPeerChainlinkInvalidEventSubj |
golang/nats-server/server/events.go:96 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:55 |
Added $SYS.SERVER.{0}.OCSP.PEER.LINK.INVALID subject constant |
leafNodeConnectEventSubj |
golang/nats-server/server/events.go:71 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:28 |
Corrected to account-scoped subject $SYS.ACCOUNT.{0}.LEAFNODE.CONNECT |
remoteLatencyEventSubj |
golang/nats-server/server/events.go:72 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:30 |
Added remote latency response subject constant |
userDirectInfoSubj |
golang/nats-server/server/events.go:76 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:40 |
Added user info request subject constant |
userDirectReqSubj |
golang/nats-server/server/events.go:77 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:41 |
Added per-user direct info request subject constant |
accNumSubsReqSubj |
golang/nats-server/server/events.go:81 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:42 |
Added account subscription-count request subject constant |
accSubsSubj |
golang/nats-server/server/events.go:84 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:43 |
Added account subscription-count response subject constant |
clientKickReqSubj |
golang/nats-server/server/events.go:62 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:44 |
Added kick-client request subject constant |
clientLDMReqSubj |
golang/nats-server/server/events.go:63 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:45 |
Added lame-duck-mode client request subject constant |
serverStatsPingReqSubj |
golang/nats-server/server/events.go:69 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:46 |
Added wildcard statsz ping request subject constant |
serverReloadReqSubj |
golang/nats-server/server/events.go:70 |
PORTED | src/NATS.Server/Events/EventSubjects.cs:47 |
Added server reload request subject constant |
accPingReqSubj |
golang/nats-server/server/events.go:52 |
MISSING | — | No .NET equivalent |
connsRespSubj |
golang/nats-server/server/events.go:57 |
MISSING | — | No .NET equivalent |
accLookupReqSubj / JWT subjects |
golang/nats-server/server/events.go:43 |
NOT_APPLICABLE | — | JWT operator resolver subjects; not yet ported |
InboxPrefix |
golang/nats-server/server/events.go:2946 |
MISSING | — | No .NET equivalent |
acceptEncodingHeader / contentEncodingHeader |
golang/nats-server/server/events.go:2232 |
PORTED | src/NATS.Server/Events/EventCompressor.cs:28 |
Added AcceptEncodingHeader and ContentEncodingHeader constants for compression negotiation headers. |
ConnectEventMsgType |
golang/nats-server/server/events.go:163 |
PORTED | src/NATS.Server/Events/EventTypes.cs:193 |
ConnectEventMsg.EventType constant — matching value |
DisconnectEventMsgType |
golang/nats-server/server/events.go:177 |
PORTED | src/NATS.Server/Events/EventTypes.cs:214 |
DisconnectEventMsg.EventType — matching value |
OCSPPeerRejectEventMsgType |
golang/nats-server/server/events.go:191 |
PORTED | src/NATS.Server/Events/EventTypes.cs:522 |
OcspPeerRejectEventMsg.EventType — matching value |
OCSPPeerChainlinkInvalidEventMsgType |
golang/nats-server/server/events.go:205 |
PORTED | src/NATS.Server/Events/EventTypes.cs:626 |
Added OcspPeerChainlinkInvalidEventMsg.EventType constant with matching advisory type |
AccountNumConnsMsgType |
golang/nats-server/server/events.go:229 |
PORTED | src/NATS.Server/Events/EventTypes.cs:247 |
AccountNumConns.EventType — matching value |
msgtrace.go — Exported Types
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
MsgTraceType |
golang/nats-server/server/msgtrace.go:50 |
MISSING | — | No .NET equivalent |
MsgTraceEvent |
golang/nats-server/server/msgtrace.go:63 |
MISSING | — | Top-level trace event container; no .NET equivalent |
MsgTraceRequest |
golang/nats-server/server/msgtrace.go:70 |
MISSING | — | No .NET equivalent |
MsgTraceEvents |
golang/nats-server/server/msgtrace.go:76 |
MISSING | — | Slice type with custom UnmarshalJSON; no .NET equivalent |
MsgTrace |
golang/nats-server/server/msgtrace.go:78 |
MISSING | — | Interface; no .NET equivalent |
MsgTraceBase |
golang/nats-server/server/msgtrace.go:83 |
MISSING | — | No .NET equivalent |
MsgTraceIngress |
golang/nats-server/server/msgtrace.go:88 |
MISSING | — | No .NET equivalent |
MsgTraceSubjectMapping |
golang/nats-server/server/msgtrace.go:98 |
MISSING | — | No .NET equivalent |
MsgTraceStreamExport |
golang/nats-server/server/msgtrace.go:103 |
MISSING | — | No .NET equivalent |
MsgTraceServiceImport |
golang/nats-server/server/msgtrace.go:109 |
MISSING | — | No .NET equivalent |
MsgTraceJetStream |
golang/nats-server/server/msgtrace.go:116 |
MISSING | — | No .NET equivalent |
MsgTraceEgress |
golang/nats-server/server/msgtrace.go:124 |
MISSING | — | No .NET equivalent |
msgtrace.go — Exported Constants
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
MsgTraceDest |
golang/nats-server/server/msgtrace.go:28 |
MISSING | — | Header name constant; no .NET equivalent |
MsgTraceDestDisabled |
golang/nats-server/server/msgtrace.go:29 |
MISSING | — | No .NET equivalent |
MsgTraceHop |
golang/nats-server/server/msgtrace.go:30 |
MISSING | — | No .NET equivalent |
MsgTraceOriginAccount |
golang/nats-server/server/msgtrace.go:31 |
MISSING | — | No .NET equivalent |
MsgTraceOnly |
golang/nats-server/server/msgtrace.go:32 |
MISSING | — | No .NET equivalent |
MsgTraceIngressType |
golang/nats-server/server/msgtrace.go:55 |
MISSING | — | No .NET equivalent |
MsgTraceSubjectMappingType |
golang/nats-server/server/msgtrace.go:56 |
MISSING | — | No .NET equivalent |
MsgTraceStreamExportType |
golang/nats-server/server/msgtrace.go:57 |
MISSING | — | No .NET equivalent |
MsgTraceServiceImportType |
golang/nats-server/server/msgtrace.go:58 |
MISSING | — | No .NET equivalent |
MsgTraceJetStreamType |
golang/nats-server/server/msgtrace.go:59 |
MISSING | — | No .NET equivalent |
MsgTraceEgressType |
golang/nats-server/server/msgtrace.go:60 |
MISSING | — | No .NET equivalent |
msgtrace.go — Exported Methods on MsgTraceEvent
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
(*MsgTraceEvent).Ingress() |
golang/nats-server/server/msgtrace.go:193 |
MISSING | — | No .NET equivalent |
(*MsgTraceEvent).SubjectMapping() |
golang/nats-server/server/msgtrace.go:200 |
MISSING | — | No .NET equivalent |
(*MsgTraceEvent).StreamExports() |
golang/nats-server/server/msgtrace.go:209 |
MISSING | — | No .NET equivalent |
(*MsgTraceEvent).ServiceImports() |
golang/nats-server/server/msgtrace.go:219 |
MISSING | — | No .NET equivalent |
(*MsgTraceEvent).JetStream() |
golang/nats-server/server/msgtrace.go:229 |
MISSING | — | No .NET equivalent |
(*MsgTraceEvent).Egresses() |
golang/nats-server/server/msgtrace.go:238 |
MISSING | — | No .NET equivalent |
(*MsgTraceEvents).UnmarshalJSON() |
golang/nats-server/server/msgtrace.go:160 |
MISSING | — | Polymorphic JSON deserialization of trace event list; no .NET equivalent |
msgtrace.go — Unexported Core Functions (>20 lines)
| Go Symbol | Go File:Line | Status | .NET Equivalent | Notes |
|---|---|---|---|---|
(*client).initMsgTrace() |
golang/nats-server/server/msgtrace.go:332 |
MISSING | — | Trace header parsing and msgTrace struct initialization; no .NET equivalent |
(*client).isMsgTraceEnabled() |
golang/nats-server/server/msgtrace.go:285 |
MISSING | — | No .NET equivalent |
(*client).msgTraceSupport() |
golang/nats-server/server/msgtrace.go:295 |
MISSING | — | No .NET equivalent |
(*client).initAndSendIngressErrEvent() |
golang/nats-server/server/msgtrace.go:596 |
MISSING | — | No .NET equivalent |
(*msgTrace).traceOnly() |
golang/nats-server/server/msgtrace.go:626 |
MISSING | — | No .NET equivalent |
(*msgTrace).setOriginAccountHeaderIfNeeded() |
golang/nats-server/server/msgtrace.go:630 |
MISSING | — | No .NET equivalent |
(*msgTrace).setHopHeader() |
golang/nats-server/server/msgtrace.go:646 |
MISSING | — | No .NET equivalent |
(*msgTrace).setIngressError() |
golang/nats-server/server/msgtrace.go:657 |
MISSING | — | No .NET equivalent |
(*msgTrace).addSubjectMappingEvent() |
golang/nats-server/server/msgtrace.go:663 |
MISSING | — | No .NET equivalent |
(*msgTrace).addEgressEvent() |
golang/nats-server/server/msgtrace.go:676 |
MISSING | — | No .NET equivalent |
(*msgTrace).addStreamExportEvent() |
golang/nats-server/server/msgtrace.go:713 |
MISSING | — | No .NET equivalent |
(*msgTrace).addServiceImportEvent() |
golang/nats-server/server/msgtrace.go:730 |
MISSING | — | No .NET equivalent |
(*msgTrace).addJetStreamEvent() |
golang/nats-server/server/msgtrace.go:745 |
MISSING | — | No .NET equivalent |
(*msgTrace).updateJetStreamEvent() |
golang/nats-server/server/msgtrace.go:759 |
MISSING | — | No .NET equivalent |
(*msgTrace).sendEventFromJetStream() |
golang/nats-server/server/msgtrace.go:774 |
MISSING | — | No .NET equivalent |
(*msgTrace).sendEvent() |
golang/nats-server/server/msgtrace.go:788 |
MISSING | — | No .NET equivalent |
genHeaderMapIfTraceHeadersPresent() |
golang/nats-server/server/msgtrace.go:509 |
MISSING | — | Parses raw NATS header bytes for trace headers; no .NET equivalent |
getConnName() |
golang/nats-server/server/msgtrace.go:300 |
MISSING | — | No .NET equivalent |
getCompressionType() |
golang/nats-server/server/msgtrace.go:318 |
MISSING | — | No .NET equivalent |
sample() |
golang/nats-server/server/msgtrace.go:494 |
MISSING | — | Probabilistic sampling for external trace; no .NET equivalent |
Keeping This File Updated
After porting work is completed:
- Update status: Change
MISSING → PORTEDorPARTIAL → PORTEDfor each item completed - Add .NET path: Fill in the ".NET Equivalent" column with the actual file:line
- Re-count LOC: Update the LOC numbers in
stillmissing.md:# Re-count .NET source LOC for this module find src/NATS.Server/Events/ -name '*.cs' -type f -exec cat {} + | wc -l # Re-count .NET test LOC for this module find tests/NATS.Server.Tests/Events/ -name '*.cs' -type f -exec cat {} + | wc -l - Add a changelog entry below with date and summary of what was ported
- Update the parity DB if new test mappings were created:
sqlite3 docs/test_parity.db "INSERT INTO test_mappings (go_test_id, dotnet_test_id, confidence, notes) VALUES (?, ?, 'manual', 'ported in YYYY-MM-DD session')"
Change Log
| Date | Change | By |
|---|---|---|
| 2026-02-26 | Ported events compression parity helpers: added typed compression enum, gzip/snappy encode-decode support, Accept-Encoding parser, and header-name constants with focused events compression tests. | codex |
| 2026-02-25 | File created with LLM analysis instructions | auto |
| 2026-02-25 | Full gap inventory populated from Go source analysis | auto |
| 2026-02-25 | Ported Events API option DTOs, server API response wrappers, OCSP peer/link advisory payloads, missing request subjects, account connect/disconnect parity fields, and hash-size helpers; validated with focused Events tests | codex |