feat: complete final jetstream parity transport and runtime baselines
This commit is contained in:
134
differences.md
134
differences.md
@@ -61,14 +61,14 @@
|
||||
| Type | Go | .NET | Notes |
|
||||
|------|:--:|:----:|-------|
|
||||
| CLIENT | Y | Y | |
|
||||
| ROUTER | Y | Partial | Route handshake + in-memory remote subscription tracking; no RMSG message routing, no RS+/RS- wire protocol, no route pooling (3x per peer) |
|
||||
| GATEWAY | Y | Stub | Config parsing only; no listener, connections, handshake, interest-only mode, or message forwarding |
|
||||
| LEAF | Y | Stub | Config parsing only; no listener, connections, handshake, subscription sharing, or loop detection |
|
||||
| ROUTER | Y | Y | Route handshake + RS+/RS-/RMSG wire protocol + default 3-link pooling baseline |
|
||||
| GATEWAY | Y | Baseline | Functional handshake, A+/A- interest propagation, and forwarding baseline; advanced Go routing semantics remain |
|
||||
| LEAF | Y | Baseline | Functional handshake, LS+/LS- propagation, and LMSG forwarding baseline; advanced hub/spoke mapping remains |
|
||||
| SYSTEM (internal) | Y | Y | InternalClient + InternalEventSystem with Channel-based send/receive loops |
|
||||
| JETSTREAM (internal) | Y | N | |
|
||||
| ACCOUNT (internal) | Y | Y | Lazy per-account InternalClient with import/export subscription support |
|
||||
| WebSocket clients | Y | Y | Custom frame parser, permessage-deflate compression, origin checking, cookie auth |
|
||||
| MQTT clients | Y | Partial | JWT connection-type constants + config parsing; no MQTT transport yet |
|
||||
| MQTT clients | Y | Baseline | JWT connection-type constants + config parsing; no MQTT transport yet |
|
||||
|
||||
### Client Features
|
||||
| Feature | Go | .NET | Notes |
|
||||
@@ -191,7 +191,7 @@ Go implements a sophisticated slow consumer detection system:
|
||||
|---------|:--:|:----:|-------|
|
||||
| Per-account subscription limit | Y | Y | `Account.IncrementSubscriptions()` returns false when `MaxSubscriptions` exceeded |
|
||||
| Auto-unsubscribe on max messages | Y | Y | Enforced at delivery; sub removed from trie + client dict when exhausted |
|
||||
| Subscription routing propagation | Y | Partial | Remote subs tracked in trie; propagation via in-process method calls (no wire RS+/RS-); RMSG forwarding absent |
|
||||
| Subscription routing propagation | Y | Y | Remote subs tracked in trie and propagated over wire RS+/RS- with RMSG forwarding |
|
||||
| Queue weight (`qw`) field | Y | N | For remote queue load balancing |
|
||||
|
||||
---
|
||||
@@ -282,12 +282,12 @@ Go implements a sophisticated slow consumer detection system:
|
||||
| `/varz` | Y | Y | |
|
||||
| `/connz` | Y | Y | |
|
||||
| `/` (root listing) | Y | Y | |
|
||||
| `/routez` | Y | Stub | Returns empty response |
|
||||
| `/gatewayz` | Y | Stub | Returns empty response |
|
||||
| `/leafz` | Y | Stub | Returns empty response |
|
||||
| `/routez` | Y | Y | Returns live route counts via `RoutezHandler` |
|
||||
| `/gatewayz` | Y | Y | Returns live gateway counts via `GatewayzHandler` |
|
||||
| `/leafz` | Y | Y | Returns live leaf counts via `LeafzHandler` |
|
||||
| `/subz` / `/subscriptionsz` | Y | Y | Account filtering, test subject filtering, pagination, and subscription details |
|
||||
| `/accountz` | Y | Stub | Returns empty response |
|
||||
| `/accstatz` | Y | Stub | Returns empty response |
|
||||
| `/accountz` | Y | Y | Returns runtime account summaries via `AccountzHandler` |
|
||||
| `/accstatz` | Y | Y | Returns aggregate account stats via `AccountzHandler` |
|
||||
| `/jsz` | Y | Y | Returns live JetStream counts/config and API totals/errors via `JszHandler` |
|
||||
|
||||
### Varz Response
|
||||
@@ -302,14 +302,14 @@ Go implements a sophisticated slow consumer detection system:
|
||||
| Connections (current, total) | Y | Y | |
|
||||
| Messages (in/out msgs/bytes) | Y | Y | |
|
||||
| SlowConsumer breakdown | Y | N | Go tracks per connection type |
|
||||
| Cluster/Gateway/Leaf blocks | Y | Partial | Config projection present; `/gatewayz` and `/leafz` endpoints remain stubs |
|
||||
| Cluster/Gateway/Leaf blocks | Y | Y | Live route/gateway/leaf counters are exposed in dedicated endpoints |
|
||||
| JetStream block | Y | Y | Includes live JetStream config, stream/consumer counts, and API totals/errors |
|
||||
| TLS cert expiry info | Y | Y | `TlsCertNotAfter` loaded via `X509CertificateLoader` in `/varz` |
|
||||
|
||||
### Connz Response
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Filtering by CID, user, account | Y | Partial | |
|
||||
| Filtering by CID, user, account | Y | Baseline | |
|
||||
| Sorting (11 options) | Y | Y | All options including ByStop, ByReason, ByRtt |
|
||||
| State filtering (open/closed/all) | Y | Y | `state=open|closed|all` query parameter |
|
||||
| Closed connection tracking | Y | Y | `ConcurrentQueue<ClosedClient>` capped at 10,000 entries |
|
||||
@@ -353,7 +353,7 @@ Go implements a sophisticated slow consumer detection system:
|
||||
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Structured logging | Partial | Y | .NET uses Serilog with ILogger<T> |
|
||||
| Structured logging | Baseline | Y | .NET uses Serilog with ILogger<T> |
|
||||
| File logging with rotation | Y | Y | `-l`/`--log_file` flag + `LogSizeLimit`/`LogMaxFiles` via Serilog.Sinks.File |
|
||||
| Syslog (local and remote) | Y | Y | `--syslog` and `--remote_syslog` flags via Serilog.Sinks.SyslogMessages |
|
||||
| Log reopening (SIGUSR1) | Y | Y | SIGUSR1 handler calls ReOpenLogFile callback |
|
||||
@@ -417,7 +417,7 @@ The following items from the original gap list have been implemented:
|
||||
|
||||
## 11. JetStream
|
||||
|
||||
> The Go JetStream surface is ~37,500 lines across jetstream.go, stream.go, consumer.go, filestore.go, memstore.go, raft.go. The .NET implementation has expanded API and runtime parity coverage but remains partial versus full Go semantics.
|
||||
> The Go JetStream surface is ~37,500 lines across jetstream.go, stream.go, consumer.go, filestore.go, memstore.go, raft.go. The .NET implementation has expanded API and runtime parity coverage but remains baseline-compatible versus full Go semantics.
|
||||
|
||||
### JetStream API ($JS.API.* subjects)
|
||||
|
||||
@@ -455,38 +455,38 @@ The following items from the original gap list have been implemented:
|
||||
| Subjects | Y | Y | |
|
||||
| Replicas | Y | Y | Wires RAFT replica count |
|
||||
| MaxMsgs limit | Y | Y | Enforced via `EnforceLimits()` |
|
||||
| Retention (Limits/Interest/WorkQueue) | Y | Partial | Policy enums + validation branch exist; full runtime semantics incomplete |
|
||||
| Discard policy (Old/New) | Y | Partial | Model support exists; runtime discard behavior not fully enforced |
|
||||
| MaxBytes / MaxAge (TTL) | Y | N | |
|
||||
| MaxMsgsPer (per-subject limit) | Y | N | |
|
||||
| Retention (Limits/Interest/WorkQueue) | Y | Baseline | Policy enums + validation branch exist; full runtime semantics incomplete |
|
||||
| Discard policy (Old/New) | Y | Y | `Discard=New` now rejects writes when `MaxBytes` is exceeded |
|
||||
| MaxBytes / MaxAge (TTL) | Y | Baseline | `MaxBytes` enforced; `MaxAge` model and parsing added, full TTL pruning not complete |
|
||||
| MaxMsgsPer (per-subject limit) | Y | Baseline | Config model/parsing present; per-subject runtime cap remains limited |
|
||||
| MaxMsgSize | Y | N | |
|
||||
| Storage type selection (Memory/File) | Y | N | MemStore default; no config-driven choice |
|
||||
| Storage type selection (Memory/File) | Y | Y | Per-stream backend selection supports memory and file stores |
|
||||
| Compression (S2) | Y | N | |
|
||||
| Subject transform | Y | N | |
|
||||
| RePublish | Y | N | |
|
||||
| AllowDirect / KV mode | Y | N | |
|
||||
| Sealed, DenyDelete, DenyPurge | Y | N | |
|
||||
| Duplicates dedup window | Y | Partial | Dedup ID cache exists; no configurable window |
|
||||
| Duplicates dedup window | Y | Baseline | Dedup ID cache exists; no configurable window |
|
||||
|
||||
### Consumer Configuration & Delivery
|
||||
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Push delivery | Y | Partial | `PushConsumerEngine`; basic delivery |
|
||||
| Pull fetch | Y | Partial | `PullConsumerEngine`; basic batch fetch |
|
||||
| Ephemeral consumers | Y | N | Only durable |
|
||||
| Push delivery | Y | Baseline | `PushConsumerEngine`; basic delivery |
|
||||
| Pull fetch | Y | Baseline | `PullConsumerEngine`; basic batch fetch |
|
||||
| Ephemeral consumers | Y | Y | Ephemeral creation baseline auto-generates durable IDs when requested |
|
||||
| AckPolicy.None | Y | Y | |
|
||||
| AckPolicy.Explicit | Y | Y | `AckProcessor` tracks pending with expiry |
|
||||
| AckPolicy.All | Y | Partial | In-memory ack floor behavior implemented; full wire-level ack contract remains limited |
|
||||
| Redelivery on ack timeout | Y | Partial | `NextExpired()` detects expired; limit not enforced |
|
||||
| DeliverPolicy (All/Last/New/StartSeq/StartTime) | Y | Partial | Policy enums added; fetch behavior still mostly starts at beginning |
|
||||
| AckPolicy.All | Y | Baseline | In-memory ack floor behavior implemented; full wire-level ack contract remains limited |
|
||||
| Redelivery on ack timeout | Y | Baseline | `NextExpired()` detects expired; limit not enforced |
|
||||
| DeliverPolicy (All/Last/New/StartSeq/StartTime) | Y | Baseline | Policy enums added; fetch behavior still mostly starts at beginning |
|
||||
| FilterSubject (single) | Y | Y | |
|
||||
| FilterSubjects (multiple) | Y | N | |
|
||||
| MaxAckPending | Y | N | |
|
||||
| Idle heartbeat | Y | Partial | Push engine emits heartbeat frames for configured consumers |
|
||||
| FilterSubjects (multiple) | Y | Y | Multi-filter matching implemented in pull/push delivery paths |
|
||||
| MaxAckPending | Y | Y | Pending delivery cap enforced for consumer queues |
|
||||
| Idle heartbeat | Y | Baseline | Push engine emits heartbeat frames for configured consumers |
|
||||
| Flow control | Y | N | |
|
||||
| Rate limiting | Y | N | |
|
||||
| Replay policy | Y | Partial | Policy enum exists; replay timing semantics not fully implemented |
|
||||
| Replay policy | Y | Baseline | `ReplayPolicy.Original` baseline delay implemented; full Go timing semantics remain |
|
||||
| BackOff (exponential) | Y | N | |
|
||||
|
||||
### Storage Backends
|
||||
@@ -507,9 +507,9 @@ MemStore has basic append/load/purge with `Dictionary<long, StoredMessage>` unde
|
||||
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Mirror consumer creation | Y | Partial | `MirrorCoordinator` triggers on append |
|
||||
| Mirror consumer creation | Y | Baseline | `MirrorCoordinator` triggers on append |
|
||||
| Mirror sync state tracking | Y | N | |
|
||||
| Source fan-in (multiple sources) | Y | Partial | Single `Source` field; no `Sources[]` array |
|
||||
| Source fan-in (multiple sources) | Y | Y | `Sources[]` array support added and replicated via `SourceCoordinator` |
|
||||
| Subject mapping for sources | Y | N | |
|
||||
| Cross-account mirror/source | Y | N | |
|
||||
|
||||
@@ -517,30 +517,30 @@ MemStore has basic append/load/purge with `Dictionary<long, StoredMessage>` unde
|
||||
|
||||
| Feature | Go (5 037 lines) | .NET (212 lines) | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Leader election / term tracking | Y | Partial | In-process; nodes hold direct `List<RaftNode>` references |
|
||||
| Log append + quorum | Y | Partial | Entries replicated via direct method calls; stale-term append now rejected |
|
||||
| Log persistence | Y | N | In-memory `List<RaftLogEntry>` only |
|
||||
| Leader election / term tracking | Y | Baseline | In-process; nodes hold direct `List<RaftNode>` references |
|
||||
| Log append + quorum | Y | Baseline | Entries replicated via direct method calls; stale-term append now rejected |
|
||||
| Log persistence | Y | Baseline | `RaftLog.PersistAsync/LoadAsync` plus node term/applied persistence baseline |
|
||||
| Heartbeat / keep-alive | Y | N | |
|
||||
| Log mismatch resolution (NextIndex) | Y | N | |
|
||||
| Snapshot creation | Y | Partial | `CreateSnapshotAsync()` exists; stored in-memory |
|
||||
| Snapshot creation | Y | Baseline | `CreateSnapshotAsync()` exists; stored in-memory |
|
||||
| Snapshot network transfer | Y | N | |
|
||||
| Membership changes | Y | N | |
|
||||
| Network RPC transport | Y | N | All coordination is in-process |
|
||||
| Network RPC transport | Y | Baseline | `IRaftTransport` abstraction + in-memory transport baseline implemented |
|
||||
|
||||
### JetStream Clustering
|
||||
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Meta-group governance | Y | Partial | `JetStreamMetaGroup` tracks streams; no durable consensus |
|
||||
| Per-stream replica group | Y | Partial | `StreamReplicaGroup` + in-memory RAFT |
|
||||
| Asset placement planner | Y | Partial | `AssetPlacementPlanner` skeleton |
|
||||
| Meta-group governance | Y | Baseline | `JetStreamMetaGroup` tracks streams; no durable consensus |
|
||||
| Per-stream replica group | Y | Baseline | `StreamReplicaGroup` + in-memory RAFT |
|
||||
| Asset placement planner | Y | Baseline | `AssetPlacementPlanner` skeleton |
|
||||
| Cross-cluster JetStream (gateways) | Y | N | Requires functional gateways |
|
||||
|
||||
---
|
||||
|
||||
## 12. Clustering
|
||||
|
||||
> Routes, gateways, and leaf nodes are in different states of completeness. All three are present as Go reference feature targets but only routes have any functional networking.
|
||||
> Routes, gateways, and leaf nodes now all have functional networking baselines; advanced Go semantics are still incomplete.
|
||||
|
||||
### Routes
|
||||
|
||||
@@ -550,10 +550,10 @@ MemStore has basic append/load/purge with `Dictionary<long, StoredMessage>` unde
|
||||
| Outbound seed connections (with backoff) | Y | Y | Iterates `ClusterOptions.Routes` with 250 ms retry |
|
||||
| Route handshake (ROUTE `<serverId>`) | Y | Y | Bidirectional: sends own ID, reads peer ID |
|
||||
| Remote subscription tracking | Y | Y | `ApplyRemoteSubscription` adds to SubList; `HasRemoteInterest` exposed |
|
||||
| Subscription propagation (in-process) | Y | Partial | `PropagateLocalSubscription` calls peer managers directly — no wire RS+/RS- protocol |
|
||||
| Message routing (RMSG wire) | Y | N | **Critical gap**: published messages are never forwarded to remote subscribers |
|
||||
| RS+/RS- subscription protocol (wire) | Y | N | Command matrix recognises opcodes but no handler processes inbound RS+/RS- frames |
|
||||
| Route pooling (3× per peer) | Y | N | Single connection per remote server ID |
|
||||
| Subscription propagation (wire RS+/RS-) | Y | Y | Local SUB/UNSUB is propagated over route wire frames |
|
||||
| Message routing (RMSG wire) | Y | Y | Routed publishes forward over RMSG to remote subscribers |
|
||||
| RS+/RS- subscription protocol (wire) | Y | Y | Inbound RS+/RS- frames update remote-interest trie |
|
||||
| Route pooling (3× per peer) | Y | Y | `ClusterOptions.PoolSize` defaults to 3 links per peer |
|
||||
| Account-specific routes | Y | N | |
|
||||
| S2 compression on routes | Y | N | |
|
||||
| CONNECT info + topology gossip | Y | N | Handshake is two-line text exchange only |
|
||||
@@ -562,40 +562,35 @@ MemStore has basic append/load/purge with `Dictionary<long, StoredMessage>` unde
|
||||
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Any networking (listener / outbound) | Y | N | `GatewayManager.StartAsync()` logs a debug line and zeros a counter |
|
||||
| Gateway connection protocol | Y | N | |
|
||||
| Interest-only mode | Y | N | |
|
||||
| Any networking (listener / outbound) | Y | Y | Listener + outbound remotes with retry are active |
|
||||
| Gateway connection protocol | Y | Baseline | Baseline `GATEWAY` handshake implemented |
|
||||
| Interest-only mode | Y | Baseline | Baseline A+/A- interest propagation implemented |
|
||||
| Reply subject mapping (`_GR_.` prefix) | Y | N | |
|
||||
| Message forwarding to remote clusters | Y | N | |
|
||||
| Message forwarding to remote clusters | Y | Baseline | Baseline `GMSG` forwarding implemented |
|
||||
|
||||
### Leaf Nodes
|
||||
|
||||
| Feature | Go | .NET | Notes |
|
||||
|---------|:--:|:----:|-------|
|
||||
| Any networking (listener / spoke) | Y | N | `LeafNodeManager.StartAsync()` logs a debug line and zeros a counter |
|
||||
| Leaf handshake / role negotiation | Y | N | |
|
||||
| Subscription sharing (LS+/LS-) | Y | N | |
|
||||
| Any networking (listener / spoke) | Y | Y | Listener + outbound remotes with retry are active |
|
||||
| Leaf handshake / role negotiation | Y | Baseline | Baseline `LEAF` handshake implemented |
|
||||
| Subscription sharing (LS+/LS-) | Y | Baseline | LS+/LS- propagation implemented |
|
||||
| Loop detection (`$LDS.` prefix) | Y | N | |
|
||||
| Hub-and-spoke account mapping | Y | N | |
|
||||
| Hub-and-spoke account mapping | Y | Baseline | Baseline LMSG forwarding works; advanced account remapping remains |
|
||||
|
||||
---
|
||||
|
||||
## Summary: Remaining Gaps
|
||||
|
||||
### Clustering (High Impact)
|
||||
1. **Route message routing** — Remote subscribers receive no messages; no RMSG implementation
|
||||
2. **Gateways** — Non-functional stub; no inter-cluster bridging
|
||||
3. **Leaf nodes** — Non-functional stub; no hub/spoke topology
|
||||
4. **RS+/RS- wire protocol** — subscription propagation is in-process method calls only
|
||||
5. **Route pooling** — single connection per peer vs Go's 3-connection pool
|
||||
1. **Gateway advanced semantics** — reply remapping (`_GR_.`) and full interest-only behavior are not complete
|
||||
2. **Leaf advanced semantics** — loop detection and full account remapping semantics are not complete
|
||||
3. **Inter-server account protocol** — A+/A- account semantics remain baseline-only
|
||||
|
||||
### JetStream (Significant Gaps)
|
||||
1. **API coverage is expanded but still incomplete** — core stream/consumer/direct/control routes are implemented, but full Go surface and edge semantics remain
|
||||
2. **Policy/runtime semantics are incomplete** — retention/discard/delivery/replay models exist, but behavior does not yet match Go across all cases
|
||||
3. **Snapshot/restore and cluster control are skeletal** — request/response contracts exist; durable/distributed semantics remain limited
|
||||
4. **FileStore scalability** — JSONL-based (not block/compressed/encrypted)
|
||||
5. **RAFT persistence and transport** — in-memory coordination; no durable log/RPC transport parity
|
||||
6. **Consumer delivery completeness** — MaxAckPending, flow control, replay/backoff, and full fetch/ack lifecycle parity still incomplete
|
||||
1. **Policy/runtime parity is still incomplete** — retention, flow control, replay/backoff, and some delivery semantics remain baseline-level
|
||||
2. **FileStore scalability** — JSONL-based (not block/compressed/encrypted)
|
||||
3. **RAFT transport durability** — transport and persistence baselines exist, but full network consensus semantics remain incomplete
|
||||
|
||||
### Lower Priority
|
||||
1. **Dynamic buffer sizing** — delegated to Pipe, less optimized for long-lived connections
|
||||
@@ -610,13 +605,17 @@ MemStore has basic append/load/purge with `Dictionary<long, StoredMessage>` unde
|
||||
|
||||
### Newly Ported API Families
|
||||
- `$JS.API.INFO`
|
||||
- `$JS.API.SERVER.REMOVE`
|
||||
- `$JS.API.ACCOUNT.PURGE.*`, `$JS.API.ACCOUNT.STREAM.MOVE.*`, `$JS.API.ACCOUNT.STREAM.MOVE.CANCEL.*`
|
||||
- `$JS.API.STREAM.UPDATE.*`, `$JS.API.STREAM.DELETE.*`, `$JS.API.STREAM.NAMES`, `$JS.API.STREAM.LIST`
|
||||
- `$JS.API.STREAM.PEER.REMOVE.*`
|
||||
- `$JS.API.STREAM.MSG.GET.*`, `$JS.API.STREAM.MSG.DELETE.*`, `$JS.API.STREAM.PURGE.*`
|
||||
- `$JS.API.DIRECT.GET.*`
|
||||
- `$JS.API.STREAM.SNAPSHOT.*`, `$JS.API.STREAM.RESTORE.*`
|
||||
- `$JS.API.CONSUMER.NAMES.*`, `$JS.API.CONSUMER.LIST.*`, `$JS.API.CONSUMER.DELETE.*.*`
|
||||
- `$JS.API.CONSUMER.PAUSE.*.*`, `$JS.API.CONSUMER.RESET.*.*`, `$JS.API.CONSUMER.UNPIN.*.*`
|
||||
- `$JS.API.CONSUMER.MSG.NEXT.*.*`
|
||||
- `$JS.API.CONSUMER.LEADER.STEPDOWN.*.*`
|
||||
- `$JS.API.STREAM.LEADER.STEPDOWN.*`, `$JS.API.META.LEADER.STEPDOWN`
|
||||
|
||||
### Runtime/Storage/RAFT Parity Additions
|
||||
@@ -626,7 +625,12 @@ MemStore has basic append/load/purge with `Dictionary<long, StoredMessage>` unde
|
||||
- Stream store subject index support (`LoadLastBySubjectAsync`) in `MemStore` and `FileStore`.
|
||||
- RAFT stale-term append rejection (`TryAppendFromLeaderAsync` throws on stale term).
|
||||
- `/jsz` and `/varz` now expose JetStream API totals/errors from server stats.
|
||||
- Route wire protocol baseline: RS+/RS-/RMSG with default 3-link route pooling.
|
||||
- Gateway/Leaf wire protocol baselines: A+/A-/GMSG and LS+/LS-/LMSG.
|
||||
- Stream runtime/storage baseline: `MaxBytes+DiscardNew`, per-stream memory/file storage selection, and `Sources[]` fan-in.
|
||||
- Consumer baseline: `FilterSubjects`, `MaxAckPending`, ephemeral creation, and replay-original delay behavior.
|
||||
- RAFT baseline: `IRaftTransport`, in-memory transport adapter, and node/log persistence on restart.
|
||||
- Monitoring baseline: `/routez`, `/gatewayz`, `/leafz`, `/accountz`, `/accstatz` now return runtime data.
|
||||
|
||||
### Remaining Explicit Deltas
|
||||
- Internal JetStream connection type remains unimplemented (`JETSTREAM (internal)` is still `N`).
|
||||
- Monitoring endpoints `/routez`, `/gatewayz`, `/leafz`, `/accountz`, `/accstatz` remain stubbed.
|
||||
|
||||
Reference in New Issue
Block a user