summaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/models/base-pubsub.ts
blob: ca313b15f56264812b5025d55fda486913256458 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
declare const window: Window;

export class BasePubSub {

    subscribers: Map<string, ISubscriber>;
    eventsCallbacks: Array<Function>;
    clientId: string;

    constructor(pluginId: string) {
        this.subscribers = new Map<string, ISubscriber>();
        this.eventsCallbacks = new Array<Function>();
        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;
}