NatsPubsub Documentation
Welcome to the comprehensive documentation for NatsPubsub - a production-ready, declarative pub/sub messaging library for NATS JetStream.
What is NatsPubsub?โ
NatsPubsub is a modern, developer-friendly library that brings battle-tested reliability patterns to NATS JetStream. Available in both JavaScript/TypeScript and Ruby, it enables seamless event-driven architecture with guaranteed message delivery, exactly-once processing, and automatic failure handling.
Key Featuresโ
- ๐ฏ Declarative API - Intuitive, class-based subscribers inspired by Rails and NestJS
- ๐ Reliability Patterns - Built-in Inbox/Outbox patterns and Dead Letter Queue (DLQ)
- ๐ Cross-Language - Full interoperability between Ruby and JavaScript services
- ๐งช Testing Support - Comprehensive testing utilities and matchers
- ๐ Observability - Built-in metrics, health checks, and monitoring UI
- โก High Performance - Optimized for throughput with batching and connection pooling
- ๐ก๏ธ Type Safety - Full TypeScript support with built-in schema validation
- ๐ง Auto-Topology - Automatic JetStream stream and consumer management
Quick Navigationโ
Getting Startedโ
Perfect for newcomers to NatsPubsub:
- Introduction - Understand core concepts and benefits
- Installation - Set up NatsPubsub in your project
- JavaScript Quick Start - Get running in 5 minutes (JS/TS)
- Ruby Quick Start - Get running in 5 minutes (Ruby)
- Core Concepts - Learn the fundamentals
Guidesโ
Step-by-step guides for common tasks:
- Publishing Messages - Send messages to topics
- Subscribing to Messages - Create and manage subscribers
- Middleware System - Add cross-cutting concerns
- Testing Strategies - Test your pub/sub code
- Deployment Guide - Deploy to production
- Performance Tuning - Optimize for throughput and latency
Patternsโ
Implement reliability patterns:
- Inbox/Outbox Pattern - Guaranteed delivery and exactly-once processing
- Dead Letter Queue - Handle failed messages gracefully
- Schema Validation - Validate messages with Zod
- Event Sourcing - Build event-sourced systems
Integrationsโ
Framework-specific integration guides:
- Ruby on Rails - Integrate with Rails applications
- Express.js - Use with Express applications
- NestJS - Integrate with NestJS
- Database Integration - PostgreSQL, MySQL, SQLite support
Referenceโ
Complete API and configuration documentation:
- JavaScript API Reference - Complete TypeScript/JavaScript API
- Ruby API Reference - Complete Ruby API
- Configuration Reference - All configuration options
- CLI Reference - Command-line tools
Advancedโ
Deep dives into internals and advanced topics:
- Architecture Overview - System design and components
- Internals - How NatsPubsub works under the hood
- Custom Repositories - Implement custom storage backends
- Security Best Practices - Secure your messaging system
Troubleshootingโ
Solutions to common problems:
- Common Issues - Frequent problems and solutions
- Debugging Guide - Debug message flow and failures
- FAQ - Frequently asked questions
Language-Specific Resourcesโ
JavaScript/TypeScriptโ
Rubyโ
Example Projectsโ
Learn by example with complete working applications:
- JavaScript/TypeScript Examples - Simple JavaScript/TypeScript examples
- Ruby Examples - Ruby implementation examples
Quick Startโ
JavaScript/TypeScriptโ
import { Publisher, Subscriber } from "nats-pubsub";
// Publish a message
const publisher = new Publisher({
servers: "nats://localhost:4222",
env: "production",
appName: "my-app",
});
await publisher.publish("order.created", {
orderId: "12345",
amount: 99.99,
});
// Subscribe to messages
class OrderSubscriber extends Subscriber {
constructor() {
super("order.created");
}
async handle(message, metadata) {
console.log("Order created:", message);
}
}
// Start subscriber
const subscriber = new OrderSubscriber();
await subscriber.connect({
servers: "nats://localhost:4222",
env: "production",
appName: "my-app",
});
Rubyโ
require 'nats_pubsub'
# Configure NatsPubsub
NatsPubsub.configure do |config|
config.servers = 'nats://localhost:4222'
config.env = 'production'
config.app_name = 'my-app'
end
# Publish a message
NatsPubsub.publish('order.created', {
order_id: '12345',
amount: 99.99
})
# Subscribe to messages
class OrderSubscriber < NatsPubsub::Subscriber
subscribe_to 'order.created'
def handle(message, context)
puts "Order created: #{message}"
end
end
# Start subscribers
NatsPubsub::Manager.start
Architecture Overviewโ
Core Conceptsโ
Topics and Subjectsโ
NatsPubsub uses hierarchical topics with automatic subject generation:
{env}.{appName}.{topic}
Example: production.order-service.order.created
Reliability Patternsโ
- Outbox Pattern: Ensures messages are published even if NATS is temporarily unavailable
- Inbox Pattern: Prevents duplicate message processing with database-backed deduplication
- Dead Letter Queue: Automatically handles failed messages with configurable retry
Middleware Systemโ
Add cross-cutting concerns with a composable middleware pipeline:
// JavaScript
subscriber.use(loggingMiddleware);
subscriber.use(retryMiddleware);
subscriber.use(metricsMiddleware);
# Ruby
class OrderSubscriber < NatsPubsub::Subscriber
use LoggingMiddleware
use RetryMiddleware
use MetricsMiddleware
end
Why NatsPubsub?โ
vs. Raw NATS Clientโ
| Feature | Raw NATS | NatsPubsub |
|---|---|---|
| Declarative API | โ | โ |
| Inbox/Outbox Patterns |