205 lines
5.3 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
}
|
|
|