UNPKG

adonisjs-livewire

Version:

A front-end framework for AdonisJS

59 lines (58 loc) 2.2 kB
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; }; } }