aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/dispatcher.js
blob: 4b8b5a436c398679ec6e43a6ad404861bb9339c0 (plain) (blame)
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
class Dispatcher {

    constructor() {
        this.listeners = [];
    }

    dispatch = (topic, payload) => {
        this.listeners.filter(l => l.topic === topic).forEach(l => l.callback(payload));
    };

    register = (topic, callback) => {
        if (typeof callback !== "function") {
            throw new Error("dispatcher callback must be a function");
        }
        if (typeof topic === "string") {
            this.listeners.push({topic, callback});
        } else if (typeof topic === "object" && Array.isArray(topic)) {
            topic.forEach(e => {
                if (typeof e !== "string") {
                    throw new Error("all topics must be strings");
                }
            });

            topic.forEach(e => this.listeners.push({e, callback}));
        } else {
            throw new Error("topic must be a string or an array of strings");
        }
    };

}

const dispatcher = new Dispatcher();

export default dispatcher;