162 lines
3.5 KiB
TypeScript
162 lines
3.5 KiB
TypeScript
|
|
|
|
/**
|
|
* Repräsentiert die Buchung eines Events
|
|
*/
|
|
class Subscription {
|
|
/**
|
|
* Erstellt eine Instanz
|
|
* @param id: nummer des Callbacks
|
|
* @param callback: Callback funktion
|
|
*/
|
|
constructor( public id: number, public callback: (payload?: any) => void) {}
|
|
}
|
|
|
|
/**
|
|
* Schnittstellenbeschreibung für ein Event
|
|
*/
|
|
interface IEvent {
|
|
/**
|
|
* Buchen eines Events
|
|
* @param callback Callback der für den Event Registriert werden soll
|
|
* @returns {} Nummer der Buchung
|
|
*/
|
|
subscribe(callback: (payload?: any) => void): number;
|
|
|
|
/**
|
|
* Abbestellen eines Events
|
|
* @param id Nummer der Buchung
|
|
* @returns {}
|
|
*/
|
|
unSubscribe(id: number): 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 callback
|
|
* @returns {} Nummer der Buchung
|
|
*/
|
|
public subscribe(callback: (payload?: any) => void) : number {
|
|
var subscription = new Subscription(this._nextId++, callback);
|
|
this._subscriptions[subscription.id] = subscription;
|
|
return subscription.id;
|
|
}
|
|
|
|
/**
|
|
* Abbestellen eines Events
|
|
* @param id Nummer der Buchung
|
|
* @returns {}
|
|
*/
|
|
public unSubscribe(id: number) : void {
|
|
this._subscriptions[id] = undefined;
|
|
}
|
|
|
|
/**
|
|
* 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]) {
|
|
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 callback Optinaler Callback
|
|
*/
|
|
subscribe(name: string, callback: (payload?: any) => void) {
|
|
let event: IEvent = this._events[name] || ((this._events[name] = new Event(name)));
|
|
return event.subscribe(callback);
|
|
}
|
|
|
|
/**
|
|
* Abbestellen eines Events
|
|
* @param name Name des Events
|
|
* @param token Nummer der Buchung
|
|
*/
|
|
unSubscribe(name: string, token: number) {
|
|
if (this._events[name]) {
|
|
(<IEvent>(this._events[name])).unSubscribe(token);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Event auslösen
|
|
* @param name Name des Events
|
|
* @param payload Optinaler Payload
|
|
*/
|
|
publish(name: string, payload?: any) {
|
|
if (this._events[name]) {
|
|
(<IEvent>(this._events[name])).notify(payload);
|
|
}
|
|
}
|
|
<<<<<<< local
|
|
}=======
|
|
}
|
|
|
|
/**
|
|
* Public Event-Manager-Modul
|
|
*/
|
|
export let eventManager: EventManager = new EventManager();
|
|
|
|
>>>>>>> other
|