Type-safe event bus for Node.js applications
Part of the SnapBack open-core ecosystem - a simple, type-safe event emitter built on EventEmitter2.
npm install @snapback-oss/events
# or pnpm add @snapback-oss/eventsimport { EventBus } from '@snapback-oss/events';
// Create event bus
const events = new EventBus();
// Subscribe to events
events.on('user.created', (data) => {
console.log('New user:', data);
});
// Emit events
events.emit('user.created', { id: '123', name: 'Alice' });
// Wildcard support
events.on('user.*', (data) => {
console.log('Any user event:', data);
});- π― Type-Safe: Full TypeScript support
- π² Namespacing: Organize events with dot notation
- π Wildcards: Listen to patterns like
user.* - β‘ Fast: Built on EventEmitter2
- πͺΆ Lightweight: Minimal dependencies
import { EventBus } from '@snapback-oss/events';
const bus = new EventBus();
// Subscribe
bus.on(event, handler);
bus.once(event, handler);
bus.off(event, handler);
// Emit
bus.emit(event, data);
// Check listeners
bus.listenerCount(event);// Organize events hierarchically
bus.emit('user.created', user);
bus.emit('user.updated', user);
bus.emit('user.deleted', userId);
// Listen to all user events
bus.on('user.*', (data) => {
console.log('User event:', data);
});// Multiple handlers for same event
bus.on('order.placed', logOrder);
bus.on('order.placed', sendEmail);
bus.on('order.placed', updateInventory);
// All execute when event fires
bus.emit('order.placed', orderData);// Handle errors in listeners
bus.on('error', (err) => {
console.error('Event bus error:', err);
});
// Errors in handlers are caught
bus.on('risky.event', () => {
throw new Error('Oops');
});const events = new EventBus();
// Publisher
function createUser(name: string) {
const user = { id: Date.now(), name };
events.emit('user.created', user);
return user;
}
// Subscriber
events.on('user.created', (user) => {
console.log(`Welcome ${user.name}!`);
});
createUser('Alice');
// Output: Welcome Alice!// Collect events
const userEvents: any[] = [];
events.on('user.*', (data) => {
userEvents.push(data);
});
events.emit('user.created', { id: 1 });
events.emit('user.updated', { id: 1 });
events.emit('user.deleted', { id: 1 });
console.log(userEvents.length); // 3- β EventEmitter2 wrapper
- β Type-safe event definitions
- β Wildcard support
- β Namespace support
- β Platform-specific events
- β Config/SDK integration hooks
const bus = new EventBus({
wildcard: true, // Enable wildcards (default: true)
delimiter: '.', // Namespace delimiter (default: '.')
maxListeners: 10, // Max listeners per event
verboseMemoryLeak: false
});// Define your events
interface AppEvents {
'user.created': { id: string; name: string };
'user.updated': { id: string; changes: any };
'user.deleted': { id: string };
}
// Type-safe event bus
const bus = new EventBus<AppEvents>();
// TypeScript knows the event data types
bus.on('user.created', (data) => {
// data is { id: string; name: string }
console.log(data.name);
});See CONTRIBUTING.md
pnpm install
pnpm build
pnpm test- Documentation: docs.snapback.dev
- Main Repository: Marcelle-Labs/snapback.dev
- NPM: @snapback-oss/events
@snapback-oss/contracts- Type definitions@snapback-oss/sdk- Client SDK
Apache-2.0 Β© SnapBack