An event emitter abstract class with priority support
- 🎯 Priority-based event handling
- ⚡ Single and one-time event listeners
- 🔄 Context binding support
- 📦 TypeScript support
- 🧪 No external dependencies
This is an abstract class, so you need to extend it to use it. The emit
method is protected, meaning only your class can trigger events internally.
npm install eventail
import { Eventail } from 'eventail';
class Player extends Eventail {
private level = 1;
private experience = 0;
public gainExperience(amount: number) {
this.experience += amount;
this.emit('experienceGained', amount, this.experience);
if (this.experience >= this.level * 100) {
this.level++;
this.experience = 0;
this.emit('leveledUp', this.level);
}
}
}
const player = new Player();
player.on('experienceGained', (amount, total) => {
console.log(`Gained ${amount} XP (Total: ${total})`);
});
player.on('leveledUp', (level) => {
console.log(`Level up! Now level ${level}`);
});
player.gainExperience(150);
const ui = {
showMessage(text: string) {
console.log(`[UI] ${text}`);
}
};
// Lower numbers = higher priority
player.on('leveledUp', function(level) {
this.showMessage(`Reached level ${level}`);
}, ui, -10);
// Runs only once
player.once('firstDeath', () => {
console.log('This only happens once');
});
const handler = (data) => console.log(data);
player.on('event', handler);
player.off('event', handler); // Remove specific listener
player.off('event'); // Remove all listeners for this event
Adds an event listener. Lower priority numbers execute first.
Adds a listener that removes itself after first execution.
Removes listener(s). Without callback, removes all listeners for the event.
Emits an event. Only available inside your class that extends Eventail.
- Listeners with the same priority may execute in any order
- The class uses WeakMap internally, so context objects can be garbage collected normally
- Event types can be strings or numbers
- This is just one way to handle events - there are probably better solutions for your specific use case
MIT © jango