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
- Use CreateOrUpdateStream instead of CreateStream when the stream may already exist with the same config.
- Validate subject patterns (valid NATS wildcards: *, >) and stream name before calling.
- Check existing stream config with `nats stream info <name>` and align your StreamConfig (retention, storage, replicas).
- 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
- Prefer CreateOrUpdateStream for idempotent provisioning.
- Centralize stream definitions in one provisioning module/pipeline.
- Validate subject wildcards before deployment.
- Check account JetStream storage limits for the environment.
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
- delete stream error
- get stream error
- create or update stream error
- publish error
- jStream is not configured
AI-assisted analysis of gofr-dev/gofr@187eb24962 (2026-09-01).
Data as JSON: /api/errors/f9ddfffc57c46477.
Report an issue: GitHub.