Files
natsdotnet/gaps/events.md
2026-02-25 15:12:52 -05:00

41 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:

  1. Extract all exported types (structs, interfaces, type aliases)
  2. Extract all exported methods on those types (receiver functions)
  3. Extract all exported standalone functions
  4. Note key constants, enums, and protocol states
  5. Note important unexported helpers that implement core logic (functions >20 lines)
  6. 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:

  1. Search for a matching type, method, or function in .NET
  2. If found, compare the behavior: does it handle the same edge cases? Same error paths?
  3. If partially implemented, note what's missing
  4. If not found, note it as MISSING

Step 3: Cross-Reference Tests

Compare Go test functions against .NET test methods:

  1. For each Go Test* function, check if a corresponding .NET [Fact] or [Theory] exists
  2. Note which test scenarios are covered and which are missing
  3. 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.go
  • golang/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 PARTIAL src/NATS.Server/Events/EventTypes.cs:520 Go has Peer certidp.CertInfo with Subject/Issuer/Fingerprint/Raw; .NET OcspPeerRejectEventMsg omits the Peer CertInfo sub-object entirely — only Kind+Reason present
OCSPPeerChainlinkInvalidEventMsg golang/nats-server/server/events.go:196 MISSING No .NET equivalent. Go struct has Link+Peer CertInfo objects. .NET has a different OcspChainValidationEvent that does not match the Go shape or advisory type string (io.nats.server.advisory.v1.ocsp_peer_link_invalid)
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 MISSING Simple struct with Name/Host/ID used in idzReq response; no .NET equivalent
ServerCapability (type + consts) golang/nats-server/server/events.go:246 MISSING JetStreamEnabled, BinaryStreamSnapshot, AccountNRG capability flags; .NET has the Flags ulong field but no typed enum/const for capability 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 MISSING No .NET equivalent; used for server-side request filtering by name/cluster/host/tags/domain
StatszEventOptions golang/nats-server/server/events.go:1956 MISSING No .NET equivalent
AccInfoEventOptions golang/nats-server/server/events.go:1962 MISSING No .NET equivalent
ConnzEventOptions golang/nats-server/server/events.go:1968 MISSING No .NET equivalent
RoutezEventOptions golang/nats-server/server/events.go:1974 MISSING No .NET equivalent
SubszEventOptions golang/nats-server/server/events.go:1980 MISSING No .NET equivalent
VarzEventOptions golang/nats-server/server/events.go:1986 MISSING No .NET equivalent
GatewayzEventOptions golang/nats-server/server/events.go:1992 MISSING No .NET equivalent
LeafzEventOptions golang/nats-server/server/events.go:1997 MISSING No .NET equivalent
AccountzEventOptions golang/nats-server/server/events.go:2004 MISSING No .NET equivalent
AccountStatzEventOptions golang/nats-server/server/events.go:2010 MISSING No .NET equivalent
JszEventOptions golang/nats-server/server/events.go:2016 MISSING No .NET equivalent
HealthzEventOptions golang/nats-server/server/events.go:2022 MISSING No .NET equivalent
ProfilezEventOptions golang/nats-server/server/events.go:2028 MISSING No .NET equivalent
ExpvarzEventOptions golang/nats-server/server/events.go:2034 MISSING No .NET equivalent
IpqueueszEventOptions golang/nats-server/server/events.go:2039 MISSING No .NET equivalent
RaftzEventOptions golang/nats-server/server/events.go:2045 MISSING No .NET equivalent
ServerAPIResponse golang/nats-server/server/events.go:2092 MISSING Generic request-reply envelope; no .NET equivalent
ServerAPIConnzResponse golang/nats-server/server/events.go:2106 MISSING Typed response wrappers for Z endpoints; no .NET equivalent
ServerAPIRoutezResponse golang/nats-server/server/events.go:2113 MISSING No .NET equivalent
ServerAPIGatewayzResponse golang/nats-server/server/events.go:2119 MISSING No .NET equivalent
ServerAPIJszResponse golang/nats-server/server/events.go:2126 MISSING No .NET equivalent
ServerAPIHealthzResponse golang/nats-server/server/events.go:2133 MISSING No .NET equivalent
ServerAPIVarzResponse golang/nats-server/server/events.go:2141 MISSING No .NET equivalent
ServerAPISubszResponse golang/nats-server/server/events.go:2148 MISSING No .NET equivalent
ServerAPILeafzResponse golang/nats-server/server/events.go:2155 MISSING No .NET equivalent
ServerAPIAccountzResponse golang/nats-server/server/events.go:2162 MISSING No .NET equivalent
ServerAPIExpvarzResponse golang/nats-server/server/events.go:2169 MISSING No .NET equivalent
ServerAPIpqueueszResponse golang/nats-server/server/events.go:2175 MISSING No .NET equivalent
ServerAPIRaftzResponse golang/nats-server/server/events.go:2183 MISSING No .NET equivalent
KickClientReq golang/nats-server/server/events.go:3180 MISSING No .NET equivalent
LDMClientReq golang/nats-server/server/events.go:3184 MISSING No .NET equivalent
UserInfo golang/nats-server/server/events.go:1500 MISSING No .NET equivalent
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 MISSING Used for debug subscriber count requests; no .NET equivalent
compressionType + consts golang/nats-server/server/events.go:2082 PARTIAL src/NATS.Server/Events/EventCompressor.cs EventCompressor handles snappy compression; no gzip compression path; compressionType enum itself not present as typed enum — only Snappy supported
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 MISSING No .NET method; EventServerInfo has the raw Flags field but no typed capability methods
(*ServerInfo).JetStreamEnabled() bool golang/nats-server/server/events.go:281 MISSING No .NET equivalent
(*ServerInfo).SetBinaryStreamSnapshot() golang/nats-server/server/events.go:287 MISSING No .NET equivalent
(*ServerInfo).BinaryStreamSnapshot() bool golang/nats-server/server/events.go:292 MISSING No .NET equivalent
(*ServerInfo).SetAccountNRG() golang/nats-server/server/events.go:297 MISSING No .NET equivalent
(*ServerInfo).AccountNRG() bool golang/nats-server/server/events.go:302 MISSING No .NET equivalent

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 PARTIAL src/NATS.Server/Events/InternalEventSystem.cs:303 SendConnectEvent() exists; missing: JWT/IssuerKey/Tags/NameTag/Kind/ClientType/MQTTClientID fields in ConnectEventDetail
(*Server).accountDisconnectEvent() golang/nats-server/server/events.go:2569 PARTIAL src/NATS.Server/Events/InternalEventSystem.cs:329 SendDisconnectEvent() exists; missing: RTT/JWT/IssuerKey/Tags/NameTag/Kind/ClientType/MQTTClientID fields in DisconnectEventDetail
(*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 MISSING Parameterized size variant; only 8-char version ported
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 MISSING Parses Accept-Encoding header for compression type; no .NET equivalent
(*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 PARTIAL src/NATS.Server/Events/EventSubjects.cs:45 Go: $SYS.SERVER.%s.OCSP.PEER.CONN.REJECT; .NET: $SYS.SERVER.{0}.OCSP.PEER.REJECT — different path segment
ocspPeerChainlinkInvalidEventSubj golang/nats-server/server/events.go:96 MISSING Go: $SYS.SERVER.%s.OCSP.PEER.LINK.INVALID; .NET OcspChainValidation uses $SYS.SERVER.{0}.OCSP.CHAIN.VALIDATION — different subject
leafNodeConnectEventSubj golang/nats-server/server/events.go:71 PARTIAL src/NATS.Server/Events/EventSubjects.cs:28 .NET subject $SYS.SERVER.{0}.LEAFNODE.CONNECT differs from Go $SYS.ACCOUNT.%s.LEAFNODE.CONNECT
remoteLatencyEventSubj golang/nats-server/server/events.go:72 MISSING No .NET equivalent
userDirectInfoSubj golang/nats-server/server/events.go:76 MISSING No .NET equivalent
userDirectReqSubj golang/nats-server/server/events.go:77 MISSING No .NET equivalent
accNumSubsReqSubj golang/nats-server/server/events.go:81 MISSING No .NET equivalent
accSubsSubj golang/nats-server/server/events.go:84 MISSING No .NET equivalent
clientKickReqSubj golang/nats-server/server/events.go:62 MISSING No .NET equivalent
clientLDMReqSubj golang/nats-server/server/events.go:63 MISSING No .NET equivalent
serverStatsPingReqSubj golang/nats-server/server/events.go:69 MISSING No .NET equivalent
serverReloadReqSubj golang/nats-server/server/events.go:70 MISSING No .NET equivalent
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 MISSING Header name constants for compression negotiation; no .NET equivalent
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 MISSING No .NET equivalent with matching type string io.nats.server.advisory.v1.ocsp_peer_link_invalid
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:

  1. Update status: Change MISSING → PORTED or PARTIAL → PORTED for each item completed
  2. Add .NET path: Fill in the ".NET Equivalent" column with the actual file:line
  3. 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
    
  4. Add a changelog entry below with date and summary of what was ported
  5. 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-25 File created with LLM analysis instructions auto
2026-02-25 Full gap inventory populated from Go source analysis auto