Emitron
A tiny, type-safe event emitter for TypeScript projects. Supports wildcard events, one-time listeners, abortable subscriptions, and returns an unsubscribe function from .on().
Installation
Install via npm:
npm install emitron
Or, if using yarn:
yarn add emitron
Usage
Importing
ES Module (ESM)
import emitron from 'emitron';
CommonJS
const emitron = require('emitron');
Defining Events
Define your event types as a TypeScript interface (must include an index signature):
interface MyEvents {
foo: string;
bar: number;
}
Typing Event Handlers (TypeScript)
You can type your event handlers for full type safety:
import type { Handler } from 'emitron';
interface MyEvents {
foo: string;
bar: number;
}
const handler: Handler<MyEvents, 'foo'> = (payload) => {
console.log(payload.eventData.toUpperCase());
};
const fooBarHandler: Handler<MyEvents, 'foo' | 'bar'> = (payload) => {
if (payload.eventName === 'foo') {
console.log('foo:', payload.eventData.toUpperCase());
} else if (payload.eventName === 'bar') {
console.log('bar:', payload.eventData + 1);
}
};
const wildcardHandler: Handler<MyEvents> = (payload) => {
switch (payload.eventName) {
case 'foo':
console.log('foo:', payload.eventData.toUpperCase());
break;
case 'bar':
console.log('bar:', payload.eventData + 1);
break;
}
};
Creating an Instance
const emitter = emitron<MyEvents>();
Subscribing to Events
const unsubscribe = emitter.on('foo', (payload) => {
console.log(`foo event:`, payload.eventData);
});
unsubscribe();
const unsubAll = emitter.on('*', (payload) => {
switch (payload.eventName) {
case 'foo':
console.log('foo:', payload.eventData.toUpperCase());
break;
case 'bar':
console.log('bar:', payload.eventData + 1);
break;
}
});
One-time Listener
emitter.on(
'bar',
(payload) => {
console.log('bar event (once):', payload.eventData);
},
{ once: true },
);
Abortable Listener
const controller = new AbortController();
emitter.on(
'foo',
(payload) => {
console.log('foo event (abortable):', payload.eventData);
},
{ signal: controller.signal },
);
controller.abort();
Subscribing to Multiple Events
Use onMany to subscribe to multiple events with a single handler:
const unsubscribe = emitter.onMany(['foo', 'bar'], (payload) => {
if (payload.eventName === 'foo') {
console.log('foo:', payload.eventData.toUpperCase());
} else if (payload.eventName === 'bar') {
console.log('bar:', payload.eventData + 1);
}
});
unsubscribe();
One-time Listener for Multiple Events
Note: When using { once: true } with onMany, the handler will trigger only once in total across all the specified events, not once per event.
emitter.onMany(
['foo', 'bar'],
(payload) => {
console.log(`${payload.eventName} event (once):`, payload.eventData);
},
{ once: true },
);
Abortable Listener for Multiple Events
const controller = new AbortController();
emitter.onMany(
['foo', 'bar'],
(payload) => {
console.log(`${payload.eventName} event (abortable):`, payload.eventData);
},
{ signal: controller.signal },
);
controller.abort();
Emitting Events
emitter.emit('foo', 'hello world');
emitter.emit('bar', 42);
Removing Listeners
emitter.off('foo', handler);
emitter.off('foo');
API
on(eventName, handler, params?): Subscribe to an event. Returns an unsubscribe function. Supports wildcard ('*'), one-time, and abortable listeners.
onMany(eventNames, handler, params?): Subscribe to multiple events with a single handler. Returns an unsubscribe function that removes the handler from all subscribed events.
off(eventName, handler?): Unsubscribe a handler or all handlers for an event.
emit(eventName, data?): Emit an event with data.
MIT License