This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Official Go client library for the NATS messaging system. Provides core pub/sub, request/reply, JetStream (streams, consumers, KV, object store), and a micro services framework. Module path: github.com/nats-io/nats.go.
This project uses a dual module setup: go.mod for production (minimal deps) and go_test.mod for testing (includes nats-server, protobuf). Always use -modfile=go_test.mod when running tests or any command that needs test dependencies.
# Build
go build ./...
# Run all tests (race detector + internal_testing tag, sequential)
go test -modfile=go_test.mod -race -v -p=1 ./... --failfast -vet=off -tags=internal_testing
# Run NoRace tests (must be run separately, without -race flag)
go test -modfile=go_test.mod -v -run=TestNoRace -p=1 ./... --failfast -vet=off
# Run a specific test
go test -modfile=go_test.mod -race -run TestName ./... -tags=internal_testing
# Run tests for a specific package
go test -modfile=go_test.mod -race ./jetstream/... --failfast
go test -modfile=go_test.mod -race ./micro/... --failfast
# Coverage
./scripts/cov.sh
# Formatting
go fmt ./...
# Vet
go vet -modfile=go_test.mod ./...
# Static analysis (as CI does it)
staticcheck -modfile=go_test.mod ./...
# Linting (golangci-lint runs only on jetstream/)
golangci-lint run --timeout 5m0s ./jetstream/...
# Spell check
find . -type f -name "*.go" | xargs misspell -error -locale US
# Update test dependencies (never change go.mod for test deps)
go mod tidy -modfile=go_test.modinternal_testing-- Exposes internal test helpers (e.g.,AddMsgFilter,CloseTCPConn) fromtesting_internal.go. Required for many tests in./test/.skip_no_race_tests-- Skips the NoRace tests. Used by coverage scripts.!race && !skip_no_race_tests-- NoRace tests intest/norace_test.goonly run when the race detector is OFF.compat-- Compatibility tests intest/compat_test.go.
- lint --
go fmt,go vet,staticcheck,misspell(all packages),golangci-lint(jetstream only). - test -- Matrix of Go 1.24 and 1.25. Runs NoRace tests first (
-run=TestNoRacewithout-race), then full race-enabled tests with-tags=internal_testing.
nats.go # Core connection, pub/sub, request/reply (~6500 lines)
parser.go # Client-side protocol parser
ws.go # WebSocket transport support
js.go # Legacy JetStream API (deprecated, see jetstream/)
jsm.go # Legacy JetStream management
kv.go # Legacy KeyValue API
object.go # Legacy Object Store API
enc.go # EncodedConn (deprecated)
netchan.go # Go channel bindings
timer.go # Internal timer utilities
context.go # Context-aware request methods
nats_iter.go # Go 1.23+ iterator support (go:build go1.23)
testing_internal.go # Internal test hooks (go:build internal_testing)
jetstream/ # New JetStream API (preferred over legacy)
jetstream.go # Top-level JetStream interface
stream.go # Stream management
stream_config.go # Stream configuration types
consumer.go # Consumer management
consumer_config.go # Consumer configuration types
pull.go # Pull consumer implementation
push.go # Push consumer (deprecated)
ordered.go # Ordered consumer
publish.go # JetStream publish methods
kv.go # KeyValue store
object.go # Object store
message.go # JetStream message types
errors.go # JetStream error types
test/ # Integration tests (package test, uses nats-server)
micro/ # Micro services framework
service.go # Service interface and implementation
request.go # Request handling
test/ # Integration tests
internal/
parser/ # NATS protocol parser (used by core client)
syncx/ # Concurrent map utility
encoders/
builtin/ # Default encoders (JSON, GOB, string)
protobuf/ # Protocol Buffers encoder
test/ # Integration tests for core package (package test)
helper_test.go # Server setup helpers (RunDefaultServer, RunBasicJetStreamServer, etc.)
norace_test.go # Tests that cannot run with -race (build tag guarded)
js_internal_test.go # Tests requiring internal_testing tag
configs/ # NATS server config files for tests
bench/ # Benchmarking utilities
examples/ # Example command-line tools (nats-pub, nats-sub, etc.)
scripts/cov.sh # Coverage collection script
- Root
nats_test.go(packagenats) -- White-box unit tests with access to unexported internals. test/(packagetest) -- Black-box integration tests. Tests start an embedded nats-server using helpers fromtest/helper_test.go. These require-modfile=go_test.modsince nats-server is a test-only dependency.jetstream/test/(packagetest) -- Integration tests for the new JetStream API, also use embedded nats-server.micro/test/(packagetest) -- Integration tests for the micro services framework.- NoRace tests -- Prefixed
TestNoRace*, guarded by//go:build !race && !skip_no_race_tests. Must be run separately without-race. - Tests always run with
-p=1(no parallel packages) because they start embedded servers on shared ports.
- License header -- Every
.gofile starts with the Apache 2.0 license header (Copyright year range). - Error variables -- Exported errors defined as
var Err... = errors.New("nats: ...")innats.go. JetStream errors injetstream/errors.gofollow the same pattern. - Options pattern -- Connection options use functional options:
nats.Connect(url, nats.Name("myapp"), nats.MaxReconnects(5)). JetStream and micro use similar patterns. - No external dependencies in production -- Only
klauspost/compress,nkeys,nuidingo.mod. Test deps (nats-server, protobuf) are isolated ingo_test.mod. PRs adding dependencies are scrutinized heavily. - Commits require sign-off -- Use
git commit -s(DCO:Signed-off-by). - US English spelling -- Enforced by
misspell -locale USin CI. - Interface-driven design -- JetStream and micro packages define interfaces (
JetStream,Stream,Consumer,Service) with concrete unexported implementations.
nats.Conn-- Core connection, handles all NATS protocol operations.nats.Msg-- Message type for pub/sub and request/reply.nats.Subscription-- Represents a subscription (sync, async, or channel-based).jetstream.JetStream-- Entry point for new JetStream API (created viajetstream.New(nc)).jetstream.Stream,jetstream.Consumer-- Stream and consumer management.micro.Service-- Micro service instance (created viamicro.AddService(nc, config)).