205 lines
5.3 KiB
TypeScript

/**
* Repräsentiert die Buchung eines Events
*/
class Subscription {
/**
* Erstellt eine Instanz
* @param id: nummer des Callbacks
* @param module: Name des Moduls das gebucht hat
* @param callback: Callback funktion
*/
constructor( public id: number, public module: string, public callback: (payload?: any) => void) {}
}
/**
* Schnittstellenbeschreibung für ein Event
*/
interface IEvent {
/**
* Buchen eines Events
* @param module Name des Moduls das gebucht hat
* @param callback Callback der für den Event Registriert werden soll
* @returns {} Nummer der Buchung
*/
subscribe(module: string, callback: (payload?: any) => void): number;
/**
* Abbestellen eines Events
* @param id Nummer der Buchung
* @returns {}
*/
unSubscribe(id: number): void;
/**
* Abbestellen aller Events für ein Modul
* @param module Name des Moduls das gebucht hat
*/
unSubscribeAll(module: string): void;
/**
* Event auslösen
* @param payload
* @returns {}
*/
notify(payload?: any): void;
}
/**
* Eventbroker-Event
*/
class Event implements IEvent {
private _name:string;
private _subscriptions: Subscription[];
private _nextId: number;
/**
* Erstellt eine Instanz
* @param name Eindeutiger Event-Name
*/
constructor(public name: string) {
this._name = name;
this._subscriptions = [];
this._nextId = 0;
}
/**
* Buchen eines Events
* @param module Name des Moduls das gebucht hat
* @param callback
* @returns {} Nummer der Buchung
*/
public subscribe(module: string, callback: (payload?: any) => void): number {
if (this._subscriptions.findIndex(c => c.module === module) === -1) {
var subscription = new Subscription(this._nextId++, module, callback);
this._subscriptions.push(subscription);
return subscription.id;
}
return -1;
}
/**
* Abbestellen eines Events
* @param id Nummer der Buchung
* @returns {}
*/
public unSubscribe(id: number): void {
var index = this._subscriptions.findIndex(c => c.id === id);
if (index !== -1)
this._subscriptions.splice(index, 1);
}
/**
* Abbestellen aller Events für ein Modul
* @param module Name des Moduls das gebucht hat
*/
public unSubscribeAll(module: string): void {
var index = this._subscriptions.findIndex(c => c.module === module);
while (index !== -1) {
//console.log(`UnsubscribeALL: ${module} --> ${this._name}`);
this._subscriptions.splice(index, 1);
index = this._subscriptions.findIndex(c => c.module === module);
}
}
/**
* Event auslösen
* @param payload Optionaler payload der mit dem Event versendet wird
* @returns {}
*/
notify(payload?: any):void {
var index;
for (index = 0; index < this._subscriptions.length; index++) {
if (this._subscriptions[index]) {
//console.log(`Notify: ${this._subscriptions[index].module} --> ${this._name}`);
this._subscriptions[index].callback(payload);
}
}
}
}
/**
* Event-Broker
*/
export class EventManager {
private static _instance: EventManager;
private _events: Event[];
/**
* Erstellt eine Instanz
*/
private constructor() {
this._events = [];
}
/**
* Instanz
*/
static getInstance(): EventManager {
if (!EventManager._instance) {
EventManager._instance = new EventManager();
}
return EventManager._instance;
}
/**
* Buchen eins Events
* @param name Name des Events
* @param module Name des Moduls das gebucht hat
* @param callback Optinaler Callback
*/
subscribe(name: string, module: string, callback: (payload?: any) => void) {
let event = this._events.find(c => c.name === name);
if (!event) {
event = new Event(name);
this._events.push(event);
}
//console.log(`Subscribe --> Module ${module} --> Event ${name}`);
return event.subscribe(module, callback);
}
/**
* Abbestellen eines Events
* @param name Name des Events
* @param token Nummer der Buchung
*/
unSubscribe(name: string, token: number) {
let event = this._events.find(c => c.name === name);
if (event) {
event.unSubscribe(token);
//console.log(`UnSubscribe --> Token ${token} --> Event ${name}`);
}
}
/**
* Abbestellen aller Events für ein Modul
* @param module Name des Moduls das gebucht hat
*/
unSubscribeAll(module: string) {
var index;
for (index = 0; index < this._events.length; index++) {
if (this._events[index]) {
this._events[index].unSubscribeAll(module);
}
}
}
/**
* Event auslösen
* @param name Name des Events
* @param payload Optinaler Payload
*/
publish(name: string, payload?: any) {
let event = this._events.find(c => c.name === name);
if (event) {
//console.log(`Publish --> Event ${name}`);
event.notify(payload);
}
}
}