1 declare const window: Window;
3 export class BasePubSub {
5 subscribers: Map<string, ISubscriber>;
6 eventsCallbacks: Array<Function>;
9 constructor(pluginId: string) {
10 this.subscribers = new Map<string, ISubscriber>();
11 this.eventsCallbacks = new Array<Function>();
12 this.clientId = pluginId;
13 this.onMessage = this.onMessage.bind(this);
15 window.addEventListener("message", this.onMessage);
18 public register(subscriberId: string, subscriberWindow: Window, subscriberUrl: string) {
20 window: subscriberWindow,
21 locationUrl: subscriberUrl || subscriberWindow.location.href
24 this.subscribers.set(subscriberId, subscriber);
27 public unregister(subscriberId: string) {
28 this.subscribers.delete(subscriberId);
31 public on(callback: Function) {
32 this.eventsCallbacks.push(callback);
35 public off(callback: Function) {
36 let index = this.eventsCallbacks.indexOf(callback);
37 this.eventsCallbacks.splice(index, 1)
40 public notify(eventType:string, eventData?:any) {
44 originId: this.clientId
47 this.subscribers.forEach( (subscriber: ISubscriber, id: string) => {
48 subscriber.window.postMessage(eventObj, subscriber.locationUrl)
52 protected onMessage(event: any) {
53 if (this.subscribers.has(event.data.originId)) {
54 this.eventsCallbacks.forEach((callback: Function) => {
55 callback(event.data, event);
61 export class PluginPubSub extends BasePubSub {
63 constructor(pluginId: string, parentUrl: string) {
65 this.register('sdc-hub', window.parent, parentUrl);
70 const registerData = {
71 pluginId: this.clientId
74 this.notify('PLUGIN_REGISTER', registerData);
77 public unsubscribe() {
78 const unregisterData = {
79 pluginId: this.clientId
82 this.notify('PLUGIN_UNREGISTER', unregisterData);
86 export interface IPubSubEvent {
92 export interface ISubscriber {