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

  1. Ensure all servers in the cluster run the same NATS Server version
  2. Retry the operation; a single malformed response is often transient
  3. Check for proxies or monitoring tools intercepting internal $JS.API subjects
  4. 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

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


AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02). Data as JSON: /api/errors/f8c0ebae08352010. Report an issue: GitHub.