gofr-dev/gofr · error

create stream error

Error message

create stream error

What it means

errCreateStream (errors.go:16) is returned by StreamManager.CreateStream when the underlying jetstream.CreateStream (or CreateOrUpdateStream) call fails. The stream could not be created on the NATS server, e.g. invalid config or a conflicting existing stream. Exercised by TestStreamManager_CreateStream_Error.

Source

Thrown at pkg/gofr/datasource/pubsub/nats/errors.go:16

package nats

import "errors"

var (
	// Client Errors.
	errServerNotProvided       = errors.New("client server address not provided")
	errSubjectsNotProvided     = errors.New("subjects not provided")
	errConsumerNotProvided     = errors.New("consumer name not provided")
	errConsumerCreationError   = errors.New("consumer creation error")
	errFailedToDeleteStream    = errors.New("failed to delete stream")
	errPublishError            = errors.New("publish error")
	errJetStreamNotConfigured  = errors.New("jStream is not configured")
	errJetStreamCreationFailed = errors.New("jStream creation failed")
	errJetStream               = errors.New("jStream error")
	errCreateStream            = errors.New("create stream error")
	errDeleteStream            = errors.New("delete stream error")
	errGetStream               = errors.New("get stream error")
	errCreateOrUpdateStream    = errors.New("create or update stream error")
	errHandlerError            = errors.New("handler error")
	errConnectionError         = errors.New("connection error")
	errSubscriptionError       = errors.New("subscription error")
)

View on GitHub (pinned to 187eb24962)

Solutions

  1. Use CreateOrUpdateStream instead of CreateStream when the stream may already exist with the same config.
  2. Validate subject patterns (valid NATS wildcards: *, >) and stream name before calling.
  3. Check existing stream config with `nats stream info <name>` and align your StreamConfig (retention, storage, replicas).
  4. Confirm the account has storage available and JetStream permissions.

Example fix

// before
err := sm.CreateStream(ctx, &jetstream.StreamConfig{Name: "ORDERS", Subjects: []string{"orders**"}})
// after: valid wildcard + upsert semantics
err := sm.CreateOrUpdateStream(ctx, &jetstream.StreamConfig{Name: "ORDERS", Subjects: []string{"orders.>"}})
Defensive patterns

Strategy: fallback

Validate before calling

cfg := &jetstream.StreamConfig{Name: "ORDERS", Subjects: []string{"orders.>"}}
for _, s := range cfg.Subjects {
    if !validNatsSubject(s) {
        return fmt.Errorf("invalid subject pattern %q", s)
    }
}

Try / catch

if err := sm.CreateStream(ctx, cfg); err != nil {
    if strings.Contains(err.Error(), "already in use") || errors.Is(err, jetstream.ErrStreamNameAlreadyInUse) {
        return sm.CreateOrUpdateStream(ctx, cfg)
    }
    return err
}

Prevention

When it happens

Trigger: StreamManager.CreateStream with a config the server rejects: duplicate stream name with different config, invalid subjects pattern, insufficient account resources, or no JetStream connection.

Common situations: Two services defining the same stream name with mismatched retention/storage settings; malformed subject wildcards (e.g. "orders**"); account storage limit reached; stream already exists and plain Create is used.

Related errors


AI-assisted analysis of gofr-dev/gofr@187eb24962 (2026-09-01). Data as JSON: /api/errors/f9ddfffc57c46477. Report an issue: GitHub.