aboutsummaryrefslogtreecommitdiff
path: root/src/server/session/agents/message_router.ts
blob: 5848e27ab667aa6d9cdc0cc3d54690eb1b9b5872 (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
import { MessageHandler, Message } from "../utilities/ipc";

export default abstract class MessageRouter {

    private onMessage: { [name: string]: MessageHandler[] | undefined } = {};

    /**
     * Add a listener at this message. When the monitor process
     * receives a message, it will invoke all registered functions.
     */
    public addMessageListener = (name: string, handler: MessageHandler, exclusive = false) => {
        const handlers = this.onMessage[name];
        if (exclusive || !handlers) {
            this.onMessage[name] = [handler];
        } else {
            handlers.push(handler);
        }
    }

    /**
     * Unregister a given listener at this message.
     */
    public removeMessageListener = (name: string, handler: MessageHandler) => {
        const handlers = this.onMessage[name];
        if (handlers) {
            const index = handlers.indexOf(handler);
            if (index > -1) {
                handlers.splice(index, 1);
            }
        }
    }

    /**
     * Unregister all listeners at this message.
     */
    public clearMessageListeners = (...names: string[]) => names.map(name => this.onMessage[name] = undefined);

    protected route: MessageHandler = async ({ name, args }) => {
        const handlers = this.onMessage[name];
        if (handlers) {
            await Promise.all(handlers.map(handler => handler({ name, args })));
        }
    }

}