On this page

NATS Protocol Reference

Interface declaration:

nats = service("nats",
    interface("main", "nats", 4222),
    image = "nats:2.10",
    healthcheck = tcp("localhost:4222"),
)

Methods

publish(subject="", data="")

Publish a message to a subject.

nats.main.publish(subject="orders.new", data='{"id":1,"item":"widget"}')
ParameterTypeDescription
subjectstringNATS subject (e.g., "orders.new", "events.>")
datastringMessage payload

Response: {"published": true, "subject": "orders.new"}

request(subject="", data="")

Send a request and wait for a reply (request-reply pattern).

resp = nats.main.request(subject="orders.get", data='{"id":1}')
# resp.data = {"subject": "orders.get", "data": "{\"id\":1,\"status\":\"confirmed\"}"}

subscribe(subject="")

Subscribe and receive one message.

resp = nats.main.subscribe(subject="orders.*")
# resp.data = {"subject": "orders.new", "data": "..."}

Fault Rules

drop(topic=)

Drop messages matching the subject pattern.

message_loss = fault_assumption("message_loss",
    target = nats.main,
    rules = [drop(topic="orders.*")],
)

Note: The topic parameter matches NATS subjects (despite the name).

delay(topic=, delay=)

slow_nats = fault_assumption("slow_nats",
    target = nats.main,
    rules = [delay(topic="*", delay="2s")],
)

Seed / Reset Patterns

NATS is stateless by default — messages are fire-and-forget. No seed or reset needed unless using JetStream (persistent streams).

nats = service("nats",
    interface("main", "nats", 4222),
    image = "nats:2.10",
    reuse = True,
    # No seed/reset — NATS is stateless
)