declare const window: Window; export class BasePubSub { subscribers: Map; eventsCallbacks: Array; clientId: string; constructor(pluginId: string) { this.subscribers = new Map(); this.eventsCallbacks = new Array(); this.clientId = pluginId; this.onMessage = this.onMessage.bind(this); window.addEventListener("message", this.onMessage); } public register(subscriberId: string, subscriberWindow: Window, subscriberUrl: string) { const subscriber = { window: subscriberWindow, locationUrl: subscriberUrl || subscriberWindow.location.href } as ISubscriber; this.subscribers.set(subscriberId, subscriber); } public unregister(subscriberId: string) { this.subscribers.delete(subscriberId); } public on(callback: Function) { this.eventsCallbacks.push(callback); } public off(callback: Function) { let index = this.eventsCallbacks.indexOf(callback); this.eventsCallbacks.splice(index, 1) } public notify(eventType:string, eventData?:any) { let eventObj = { type: eventType, data: eventData, originId: this.clientId } as IPubSubEvent; this.subscribers.forEach( (subscriber: ISubscriber, id: string) => { subscriber.window.postMessage(eventObj, subscriber.locationUrl) }); } protected onMessage(event: any) { if (this.subscribers.has(event.data.originId)) { this.eventsCallbacks.forEach((callback: Function) => { callback(event.data, event); }) } } } export class PluginPubSub extends BasePubSub { constructor(pluginId: string, parentUrl: string) { super(pluginId); this.register('sdc-hub', window.parent, parentUrl); this.subscribe(); } public subscribe() { const registerData = { pluginId: this.clientId }; this.notify('PLUGIN_REGISTER', registerData); } public unsubscribe() { const unregisterData = { pluginId: this.clientId }; this.notify('PLUGIN_UNREGISTER', unregisterData); } } export interface IPubSubEvent { type: string; originId: string; data: any; } export interface ISubscriber { window: Window; locationUrl: string; }