UNPKG

@nent/core

Version:

Functional elements to add routing, data-binding, dynamic HTML, declarative actions, audio, video, and so much more. Supercharge static HTML files into web apps without script or builds.

85 lines (81 loc) 2.11 kB
/*! * NENT 2022 */ 'use strict'; /* istanbul ignore file */ class EventEmitter { constructor() { this.events = {}; this.wildcardEvents = []; } recalcWildcardEvents() { const newWildCardEvents = []; for (const i in this.events) { if (i.endsWith('*') && this.events[i] && this.events[i].length > 0) { newWildCardEvents.push(i); } } this.wildcardEvents = newWildCardEvents; } on(event, listener) { if (typeof this.events[event] !== 'object') { this.events[event] = []; } this.events[event].push(listener); this.recalcWildcardEvents(); return () => { this.removeListener(event, listener); }; } removeListener(event, listener) { if (typeof this.events[event] !== 'object') { return; } const idx = this.events[event].indexOf(listener); if (idx > -1) { this.events[event].splice(idx, 1); } this.recalcWildcardEvents(); } removeAllListeners() { Object.keys(this.events).forEach((event) => this.events[event].splice(0, this.events[event].length)); this.recalcWildcardEvents(); } emit(event, ...args) { if (typeof this.events[event] === 'object') { [...this.events[event]].forEach(listener => { listener.apply(this, args); }); } if (event !== '*') { this.emit('*', event, ...args); return; } for (const rawWcEvent of this.wildcardEvents) { const wcEvent = rawWcEvent.slice(0, rawWcEvent.endsWith('.*') ? -2 : -1); if (!event.endsWith('*') && event !== wcEvent && event.startsWith(wcEvent)) { this.emit(rawWcEvent, event, ...args); } } } once(event, listener) { const remove = this.on(event, (...args) => { remove(); listener.apply(this, args); this.recalcWildcardEvents(); }); return remove; } destroy() { this.removeAllListeners(); } } const actionBus = new EventEmitter(); const eventBus = new EventEmitter(); exports.EventEmitter = EventEmitter; exports.actionBus = actionBus; exports.eventBus = eventBus;