/** * @author Martin Karkowski * @email m.karkowski@zema.de * @create date 2021-03-22 19:03:15 * @modify date 2021-10-19 09:10:49 * @desc [description] */ import { EventEmitter } from "events"; import * as Logger from "js-logger"; import { ILogger } from "js-logger"; import { NopeObservable } from "../../observables/nopeObservable"; import { ICommunicationMirror, IEmitter, ValidEventTypesOfMirror } from "../../types/nope/nopeCommunication.interface"; import { INopeObservable } from "../../types/nope/nopeObservable.interface"; /** * A Basic Mirror, used to share the events in a Mirror Style. * This Layer should not be used directly. this should only * be extended. * * @export * @class EventMirror * @implements {ICommunicationMirror} */ export class EventMirror implements ICommunicationMirror { /** * Function which will be used to subscribe Data * * @param {(symbol | ValidEventTypesOfMirror)} event The Event to listen to * @param {(...args: any[]) => void} listener The "Listener" (A Callback, which will be called) * @memberof EventMirror */ on( event: symbol | ValidEventTypesOfMirror, listener: (...args: any[]) => void ): void { this._emitter.on(event, listener); if (event !== "StatusUpdate" && this._logger?.enabledFor(Logger.DEBUG)) { this._emitter.on(event, (...args) => { this._logger.debug("received", "'" + event.toString() + "'", ...args); }); } } /** * Function, which will be used to emit data * * @param {ValidEventTypesOfMirror} event the name fo the event to emit something * @param {*} data the data to emit * @memberof EventMirror */ emit(event: ValidEventTypesOfMirror, data: any): void { this._emitter.emit(event, data); } /** * Flag, showing whether the Mirror is connected or not. * * @type {INopeObservable} * @memberof EventMirror */ connected: INopeObservable; receivesOwnMessages: boolean; async dispose(): Promise { // Disposes the Emitter. (this._emitter as any)?.removeAllListeners(); } /** * Creates an instance of EventMirror. * @param {IEmitter} [_emitter=new EventEmitter() as any] The Type of Emitter to use. * @param {ILogger} [_logger] a Logger * @memberof EventMirror */ constructor( protected _emitter: IEmitter = new EventEmitter() as any, protected _logger?: ILogger ) { this.connected = new NopeObservable(); this.connected.setContent(true); this.receivesOwnMessages = true; } }