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 }))); } } }