Skip to content

Getting Started

The Orchestra Analogy

Imagine you're at a symphony concert. The conductor raises their baton, and suddenly:

  • The violins know exactly when to play
  • The drums don't overpower the flutes
  • Each section responds to cues without shouting across the room
  • If a musician misses their cue, they catch up gracefully

Now imagine the alternative: a room full of musicians shouting instructions to each other. Chaos, right?

Most event buses are the "shouting room." Nexus is the conductor.

The Problem with Traditional Event Buses

Standard event libraries (like Node's EventEmitter or custom implementations) suffer from:

  1. No priority system: Everything runs at the same urgency, blocking critical UI updates
  2. No failure recovery: One error crashes your listener chain
  3. No request/reply: You have to manually implement correlation IDs
  4. No cross-context communication: Client and server are isolated islands
  5. No learning: The same mistakes happen repeatedly

Nexus was designed from the ground up to solve these real-world production issues.

Installation

bash
npm install @caeligo/nexus-orchestrator

Or with other package managers:

bash
# Yarn
yarn add @caeligo/nexus-orchestrator

# pnpm
pnpm add @caeligo/nexus-orchestrator

Your First Nexus Instance

typescript
import { Nexus } from '@caeligo/nexus-orchestrator';

// Create a bus instance
const bus = new Nexus();

// Subscribe to an event
bus.on('user:login', (payload) => {
  console.log(`Welcome, ${payload.username}!`);
});

// Emit an event
bus.emit('user:login', { username: 'Alice', timestamp: Date.now() });

Output:

Welcome, Alice!

Simple, right? But this is just scratching the surface.

Basic Example: Real-World Dashboard

Let's build a simple analytics dashboard that updates in real-time:

typescript
import { Nexus } from '@caeligo/nexus-orchestrator';

// Define your event types for type safety
interface DashboardEvents {
  'metrics:cpu': { usage: number };
  'metrics:memory': { used: number; total: number };
  'alert:critical': { message: string; severity: 'high' | 'medium' | 'low' };
}

const bus = new Nexus<DashboardEvents>({
  debug: true,        // Enable DevTools
  replayMemory: 10    // Keep last 10 events
});

// Setup listeners
bus.on('metrics:cpu', (data) => {
  document.getElementById('cpu')!.innerText = `${data.usage}%`;
});

bus.on('metrics:memory', (data) => {
  const percent = ((data.used / data.total) * 100).toFixed(1);
  document.getElementById('memory')!.innerText = `${percent}%`;
});

bus.on('alert:critical', (alert) => {
  const alertDiv = document.createElement('div');
  alertDiv.className = `alert alert-${alert.severity}`;
  alertDiv.innerText = alert.message;
  document.getElementById('alerts')!.appendChild(alertDiv);
});

// Simulate data updates (in real app, this would come from WebSocket)
setInterval(() => {
  bus.emit('metrics:cpu', { usage: Math.random() * 100 });
  bus.emit('metrics:memory', { 
    used: Math.random() * 8000, 
    total: 8000 
  });
}, 1000);

Edge Case: Handling Late Subscribers

What if a component subscribes after data has already been emitted? With replay memory, late arrivals catch up automatically:

typescript
const bus = new Nexus({
  replayMemory: 50  // Keep last 50 events per channel
});

// Emit data early
bus.emit('config:loaded', { theme: 'dark', language: 'en' });

// Component mounts 5 seconds later and needs the config
setTimeout(() => {
  bus.on('config:loaded', (config) => {
    console.log('Late subscriber got:', config);
    // Output: { theme: 'dark', language: 'en' }
  }, { replay: true });  // 👈 The magic happens here
}, 5000);

Configuration Options

Here's the complete configuration interface:

typescript
const bus = new Nexus({
  // Replay System: Store past events for late subscribers
  replayMemory: 50,               // Keep last 50 events per channel
  
  // Cross-Tab Sync: Share events across browser tabs
  crossTabName: 'my-app',         // BroadcastChannel name
  
  // Debugging: Redux DevTools integration
  debug: true,                    // Enable logging and DevTools
  
  // AI Prediction: Learn user patterns (more in AI chapter)
  predictionThreshold: 0.7,       // Emit predictions at 70% confidence
  
  // Teleportation: Send events to server (more in Networking chapter)
  teleport: (event, payload) => {
    websocket.send(JSON.stringify({ event, payload }));
  },
  
  // Chaos Monkey: Test resilience (more in Testing chapter)
  chaos: {
    dropRate: 0.1,               // Drop 10% of events
    maxDelay: 2000,              // Add up to 2s latency
    exclude: ['app:init']        // Never chaos-test critical events
  }
});

Architecture Diagram

Next Steps

Now that you understand the basics, let's explore the architecture in depth:

Quick Reference

Import:

typescript
import { Nexus } from '@caeligo/nexus-orchestrator';

Create instance:

typescript
const bus = new Nexus(options);

Core methods:

  • bus.on(event, listener, options) - Subscribe to events
  • bus.emit(event, payload, options) - Publish events
  • bus.once(event, listener) - Subscribe for single execution
  • bus.request(event, payload, timeout) - Request/Reply pattern
  • bus.cursor(event, initialValue) - Get reactive state cursor

Advanced:

  • bus.pipe(event, ...operators, listener) - Middleware pipeline
  • bus.feed(event, payload) - Ingest external events
  • bus.scenario() - Fluent workflow builder
  • bus.generateGraph() - Export Mermaid diagram

Released under the MIT License.