adonisjs-livewire
Version:
A front-end framework for AdonisJS
59 lines (58 loc) • 2.2 kB
JavaScript
export class EventBus {
listeners = {};
listenersAfter = {};
listenersBefore = {};
on(name, callback) {
if (!this.listeners[name])
this.listeners[name] = [];
this.listeners[name].push(callback);
return () => this.off(name, callback);
}
before(name, callback) {
if (!this.listenersBefore[name])
this.listenersBefore[name] = [];
this.listenersBefore[name].push(callback);
return () => this.off(name, callback);
}
after(name, callback) {
if (!this.listenersAfter[name])
this.listenersAfter[name] = [];
this.listenersAfter[name].push(callback);
return () => this.off(name, callback);
}
off(name, callback) {
let index = this.listeners[name]?.indexOf(callback);
let indexAfter = this.listenersAfter[name]?.indexOf(callback);
let indexBefore = this.listenersBefore[name]?.indexOf(callback);
if (index !== undefined && index > -1)
this.listeners[name].splice(index, 1);
else if (indexAfter !== undefined && indexAfter > -1)
this.listenersAfter[name].splice(indexAfter, 1);
else if (indexBefore !== undefined && indexBefore > -1)
this.listenersBefore[name].splice(indexBefore, 1);
}
async trigger(name, ...params) {
const middlewares = [];
const listeners = [
...(this.listenersBefore[name] ?? []),
...(this.listeners[name] ?? []),
...(this.listenersAfter[name] ?? []),
];
for (const callback of listeners) {
const result = await callback(...params);
if (result) {
middlewares.push(result);
}
}
return async (forward = null, ...extras) => {
for (const finisher of middlewares) {
if (!finisher)
continue;
const finalCallback = Array.isArray(finisher) ? finisher[finisher.length - 1] : finisher;
const result = await finalCallback(forward, ...extras);
forward = result ?? forward;
}
return forward;
};
}
}