nats-io/nats-server · error
invalid stream create response: missing stream info
Error message
invalid stream create response: missing stream info
What it means
After sending a JS API stream create request, the server decoded the response but its StreamInfo field was nil (and ToError produced no error), so the reply is considered invalid. The server requires StreamInfo on a successful create response; a nil-info response means the JS API replied without the expected payload.
Source
Thrown at server/mqtt.go:1832
cdr := cdri.(*JSApiConsumerDeleteResponse)
return cdr, cdr.ToError()
}
func (jsa *mqttJSA) createStream(cfg *StreamConfig) (*StreamInfo, bool, error) {
cfgb, err := json.Marshal(cfg)
if err != nil {
return nil, false, err
}
scri, err := jsa.newRequest(mqttJSAStreamCreate, fmt.Sprintf(JSApiStreamCreateT, cfg.Name), 0, cfgb)
if err != nil {
return nil, false, err
}
scr := scri.(*JSApiStreamCreateResponse)
if err = scr.ToError(); err != nil {
return nil, false, err
}
if scr.StreamInfo == nil {
return nil, false, fmt.Errorf("invalid stream create response: missing stream info")
}
return scr.StreamInfo, scr.DidCreate, nil
}
func (jsa *mqttJSA) updateStream(cfg *StreamConfig) (*StreamInfo, error) {
cfgb, err := json.Marshal(cfg)
if err != nil {
return nil, err
}
scri, err := jsa.newRequest(mqttJSAStreamUpdate, fmt.Sprintf(JSApiStreamUpdateT, cfg.Name), 0, cfgb)
if err != nil {
return nil, err
}
scr := scri.(*JSApiStreamUpdateResponse)
if err = scr.ToError(); err != nil {
return nil, err
}
if scr.StreamInfo == nil {View on GitHub (pinned to 3a66a489d2)
Solutions
- Ensure all servers in the cluster run the same NATS Server version
- Retry the operation; a single malformed response is often transient
- Check for proxies or monitoring tools intercepting internal $JS.API subjects
- If reproducible, capture a CORE debug log and report to nats-server maintainers
Defensive patterns
Strategy: retry
Validate before calling
// Sanity-check internal JS API works at all:
js, _ := nc.JetStream()
if _, err := js.AddStream(&nats.StreamConfig{Name: "smoke-test"}); err != nil {
// investigate JS API layer before MQTT use
}
js.DeleteStream("smoke-test") Type guard
func hasStreamInfo(scr *JSApiStreamCreateResponse) bool { return scr != nil && scr.StreamInfo != nil } Try / catch
if strings.Contains(err.Error(), "invalid stream create response") {
// transient/protocol issue: retry once, then check cluster version skew
return retryOnceElseInvestigate(op)
} Prevention
- Keep all servers on identical NATS Server versions
- Never intercept or proxy internal $JS.API subjects
- Enable trace/debug logging when investigating malformed internal responses
When it happens
Trigger: JSApiStreamCreateResponse arrives with DidCreate/error unset and StreamInfo nil — e.g. malformed/empty reply, protocol mismatch between server versions on internal JS API, or a corrupted internal response.
Common situations: Mixed-version clusters where internal JS API shapes differ; truncated or malformed internal responses under extreme load; custom/intercepted JS API traffic.
Related errors
- invalid stream update response: missing stream info
- topic filter cannot be empty
- malformed variable int
- received a second CONNECT packet
- ack wait must be a positive value
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/f8c0ebae08352010.
Report an issue: GitHub.