thelounge/client/js/eventbus.ts

52 lines
1.2 KiB
TypeScript
Raw Permalink Normal View History

2020-03-16 17:58:40 +00:00
const events = new Map();
class EventBus {
/**
* Register an event handler for the given type.
*
* @param {String} type Type of event to listen for.
* @param {Function} handler Function to call in response to given event.
*/
on(type: string, handler: (...evt: any[]) => void) {
2020-03-16 17:58:40 +00:00
if (events.has(type)) {
2020-04-26 09:34:22 +00:00
events.get(type).push(handler);
2020-03-16 17:58:40 +00:00
} else {
2020-04-26 09:34:22 +00:00
events.set(type, [handler]);
2020-03-16 17:58:40 +00:00
}
}
/**
* Remove an event handler for the given type.
*
* @param {String} type Type of event to unregister `handler` from.
* @param {Function} handler Handler function to remove.
*/
off(type: string, handler: (...evt: any[]) => void) {
2020-03-16 17:58:40 +00:00
if (events.has(type)) {
2020-04-26 09:34:22 +00:00
events.set(
type,
events.get(type).filter((item: (...evt: any[]) => void) => item !== handler)
2020-04-26 09:34:22 +00:00
);
2020-03-16 17:58:40 +00:00
}
}
/**
* Invoke all handlers for the given type.
*
* @param {String} type The event type to invoke.
* @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler.
*/
emit(type: string, ...evt: any) {
2020-03-16 17:58:40 +00:00
if (events.has(type)) {
2020-04-26 09:34:22 +00:00
events
.get(type)
.slice()
.map((handler: (...evts: any[]) => void) => {
handler(...evt);
2020-04-26 09:34:22 +00:00
});
2020-03-16 17:58:40 +00:00
}
}
}
export default new EventBus();