Ultra-fast ES2023 event emitter with 905B bundle size and race-condition safety.
- π₯ Ultra Fast: 33M+ operations/second with native Set/Map optimizations
- πͺΆ Tiny Bundle: Only 905B minified, 0 dependencies
- π‘οΈ Race-Condition Safe: Immutable snapshots prevent handler modification issues
- π― ES2023 Native: Optional chaining, nullish coalescing, spread operators
- π¦ Tree Shakeable: ES modules with proper exports
- π§ TypeScript: Full type safety with generics and strict types
npm install zephyr-eventsimport zephyrEvents from 'zephyr-events';
// Create typed emitter
type Events = {
  user: { id: number; name: string }
  error: Error
}
const emitter = zephyrEvents<Events>();
// Subscribe with auto-cleanup
const unsubscribe = emitter.on('user', (user) => {
  console.log(`User: ${user.name}`);
});
// Emit events
emitter.emit('user', { id: 1, name: 'Alice' });
// Cleanup
unsubscribe();Create a new event emitter instance.
const emitter = zephyrEvents<{
  message: string
  data: { value: number }
}>();Register event handler. Returns unsubscribe function.
const unsub = emitter.on('message', (msg) => {
  console.log(msg);
});
// Wildcard listener
emitter.on('*', (type, event) => {
  console.log(`Event ${type}:`, event);
});Remove event handler(s).
// Remove specific handler
emitter.off('message', handler);
// Remove all handlers for type
emitter.off('message');Emit event to all registered handlers.
emitter.emit('message', 'Hello World!');
emitter.emit('data', { value: 42 });Zephyr Events uses a dual-storage architecture for maximum performance:
- Set: O(1) add/remove operations
- Array snapshots: Fast iteration with race-condition safety
- ES2023 optimizations: Native optional chaining and nullish coalescing
Handlers are executed from immutable snapshots:
emitter.on('test', function selfRemover() {
  emitter.off('test', selfRemover); // Safe during emit
});- Nullish coalescing: all ??= new Map()
- Optional chaining: handlers?.size
- Spread operators: [...handlers]for fast snapshots
- ESM: dist/zephyr-events.mjs(905B)
- CommonJS: dist/zephyr-events.js(977B)
- UMD: dist/zephyr-events.umd.js(1.3KB)
| Feature | Zephyr Events | mitt* | eventemitter3 | 
|---|---|---|---|
| Bundle Size | 905B | 200B | 7KB | 
| TypeScript | β Native | β | β | 
| Race-Safe | β | β | β | 
| ES2023 | β | β | β | 
| Performance | 33M ops/s | 15M ops/s | 10M ops/s | 
*Based on original mitt package by Jason Miller
Comprehensive performance benchmarks on Apple Silicon M-series (ARM64) with Node.js v23.10.0:
| Operation | Ops/Second | Description | 
|---|---|---|
| Emitter Creation | 10.54M | Creating new emitter instances | 
| Single Handler Emit | 33.69M | Emitting to one event handler | 
| Wildcard Emit | 26.12M | Emitting to wildcard listeners | 
| 10 Handlers Emit | 9.32M | Emitting to 10 concurrent handlers | 
| 100 Handlers Emit | 1.57M | Emitting to 100 concurrent handlers | 
| Mixed Operations | 7.17M | Realistic usage: on/emit/off cycle | 
| Operation | Ops/Second | Description | 
|---|---|---|
| Off Method | 194.17M | Removing specific handler with .off() | 
| Unsubscribe | 143.54M | Removing handler with returned function | 
| Event Subscription | 9.19K | Adding new event handlers with .on() | 
| Memory Stress | 130 | Complex multi-event scenario | 
- π₯ Ultra-fast emission: Up to 33.69M operations/second for single handlers
- β‘ Instant cleanup: Handler removal at 194.17M operations/second
- π Scales efficiently: Maintains high performance with multiple handlers
- π‘οΈ Race-condition safe: Minimal overhead for safety guarantees
- π― Real-world optimized: 7.17M ops/sec for typical usage patterns
- Dual Storage: Set for O(1) add/remove + Array snapshots for fast iteration
- ES2023 Native: Optional chaining (?.) and nullish coalescing (??) optimizations
- Memory Efficient: Stable performance under stress conditions
- Zero Dependencies: Pure JavaScript with no external overhead
Zephyr Events is a heavy modernization and performance upgrade of the original mitt package by Jason Miller. Thanks for the foundational work!
Contributions welcome! Please read CONTRIBUTING.md.
MIT Β© ebogdum
Original mitt: MIT Β© Jason Miller