nope/lib/communication/mirrors/eventMirror.ts
2021-12-04 08:25:26 +01:00

93 lines
2.6 KiB
TypeScript

/**
* @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 as any).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<boolean>}
* @memberof EventMirror
*/
connected: INopeObservable<boolean>;
async dispose(): Promise<void> {
// 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,
public readonly receivesOwnMessages: boolean = true
) {
this.connected = new NopeObservable<boolean>();
this.connected.setContent(true);
this.receivesOwnMessages = true;
}
}