HorizonRepublic/nestjs-jetstream
NestJS transport for NATS JetStream — durable events, broadcast, ordered delivery, RPC, dead letter queues, and lifecycle hooks
A NATS JetStream transport for NestJS microservices.
Same @EventPattern and @MessagePattern decorators, with durability,
bounded retries, dead-letter queues and OpenTelemetry tracing underneath.
Documentation · Quick start · Header contract · Examples
NestJS includes a built-in NATS transport that is fire-and-forget. A pod restart loses whatever was in flight, a handler that throws is never retried, and when something goes wrong in production there is nothing to look at.
Same decorators, same client.emit(). One module import changes underneath.
// app.module.ts
@Module({
imports: [JetstreamModule.forRoot({ servers: ['nats://localhost:4222'] })],
})
export class AppModule {}
// orders.controller.ts
@Controller()
export class OrdersController {
@EventPattern('orders.created')
async onCreated(@Payload() order: Order) {
await this.billing.charge(order); // throws → nak → redelivered with backoff
}
}
The transport acknowledges an event only after its handler resolves. A throw is a with exponential backoff. Exhausted retries go to a typed dead-letter queue with the original headers intact. A header rides through every hop.
No download data available
No tracked packages depend on this.
naktraceparent| Capability | How |
|---|---|
| At-least-once delivery | Ack after the handler resolves, with bounded retries and backoff |
| Broadcast | One message to every running pod via per-service durable consumers |
| Ordered delivery | Sequential per partition key, without giving up horizontal scale |
| RPC | Core NATS for speed or JetStream for durability, same @MessagePattern |
| Dead-letter queue | Typed sink, original headers preserved, onDeadLetter callback |
| Tracing | W3C traceparent propagated end to end, OpenTelemetry spans built in |
| Operations | Health checks, graceful shutdown, scheduled messages, per-message TTL |
npm i @horizon-republic/nestjs-jetstream
Requires Node >= 22, NestJS 10 to 12, and NATS Server >= 2.10 with JetStream enabled.
One runnable example per pattern, ten in all, lives under
examples/.
Versioning follows semver: breaking changes come only in majors, and the header contract does not change across minors.
MIT · © 2026 Horizon Republic · Changelog · Contributing · Security