UNPKG

klf-200-api

Version:

This module provides a wrapper to the socket API of a Velux KLF-200 interface. You will need at least firmware 0.2.0.0.71 on your KLF interface for this library to work.

105 lines 4.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TypedEvent = void 0; const debug_1 = require("debug"); const debug = (0, debug_1.default)(`klf-200-api:TypedEvents`); /** passes through events as they happen. You will not get events from before you start listening */ /** * Event emitter class that handles typed events. * * @export * @class TypedEvent<T> */ class TypedEvent { listeners = []; listenersOncer = []; /** * Adds a listener function to an event emitter. * * @param listener Function that is called if the event is emitted. * @returns {Disposable} Returns a disposable object that should be disposed when not needed anymore. * @memberof TypedEvent<T> */ on = (listener) => { debug(`TypedEvent on.`); this.listeners.push(listener); debug(`${this.listeners.length} listeners registered.`); return { dispose: () => this.off(listener), }; }; /** * Adds a listener function to an event emitter that is called only once. * * @param listener Function that is called only once if the event is emitted. * @returns {void} * @memberof TypedEvent<T> */ once = (listener) => { debug(`TypedEvent once.`); this.listenersOncer.push(listener); debug(`${this.listenersOncer.length} listeners registered.`); }; /** * Removes a listener function from an event emitter. * If it is called from inside an event handler * the current event will still call the removed handler * if it wasn't called so far. * * @param listener Function that should be removed. * @returns {void} * @memberof TypedEvent<T> */ off = (listener) => { debug(`TypedEvent off.`); const callbackIndex = this.listeners.indexOf(listener); if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1); debug(`${this.listeners.length} listeners registered.`); }; /** * Calls the registered event handler listener functions on after the other. * The order in which the functions are called is not defined. * * @param {T} event The typed event parameter that will be provided to each listener. * @returns {Promise<void>} * @memberof TypedEvent<T> */ emit = async (event) => { debug(`TypedEvent emit. ${this.listeners.length} listeners and ${this.listenersOncer.length} once listeners to be called.`); // Copy all listeners to a temporary array // in case that an event listener would // remove itself from the list. const temporaryListeners = this.listeners.slice(); /** Update any general listeners */ for (const listener of temporaryListeners) { debug(`Calling Listener ${listener.toString()}.`); await Promise.resolve(listener(event)); debug(`Listener ${listener.toString()} called.`); } // Copy all listeners to a temporary array // in case that an event listener would // remove itself from the list. const temporaryListenersOnce = this.listenersOncer.slice(); /** Clear the `once` queue */ for (const listener of temporaryListenersOnce) { debug(`Calling Listener Once ${listener.toString()}.`); await Promise.resolve(listener(event)); debug(`Listener Once ${listener.toString()} called.`); } this.listenersOncer = []; }; /** * Pipes another event emitter to this event emitter. * * @param te Event emitter that is called after this event emitter. * @returns {Disposable} Returns a disposable object that should be disposed when not needed anymore. * @memberof TypedEvent<T> */ pipe = (te) => { debug(`TypedEvent pipe.`); return this.on(async (e) => await te.emit(e)); }; } exports.TypedEvent = TypedEvent; //# sourceMappingURL=TypedEvent.js.map