import { getChannel } from "../connection"; import type { AnyMessage } from "./messages"; export type Handlers = { [event: string]: EventHandler; }; type EventHandler = { tokenHandler: TokenHandler; directHandlers: Handler[]; }; export type TokenHandler = { [token: string]: Handler; }; export type Handler = (message?: Message) => void; export type UnregisterHandler = () => void; export function registerTokenHandler( handlers: Handlers, event: string, token: string | null, handler: Handler ): UnregisterHandler { let eventHandler = handlers[event]; // If this event did not yet have any handlers registered we have to register it if (eventHandler === undefined) { eventHandler = { tokenHandler: {}, directHandlers: [], }; handlers[event] = eventHandler; registerNewEvent(eventHandler, event); } let unregister: UnregisterHandler; if (token === null) { const directHandlers = eventHandler.directHandlers; directHandlers.push(handler); unregister = () => { const index = directHandlers.findIndex(h => h === handler); directHandlers.splice(index, 1); }; } else { const tokenHandler = eventHandler.tokenHandler; tokenHandler[token] = handler; unregister = () => { delete tokenHandler[token]; }; } return unregister; } function registerNewEvent( eventHandler: EventHandler, event: string ) { const callback = (data: Message) => { handleEvent(eventHandler, data); }; getChannel().on(event, callback); } function handleEvent( eventHandler: EventHandler, message: Message ) { if (message["token"] !== undefined) { const token = message["token"]; const handler: Handler = eventHandler.tokenHandler[token]; if (handler === undefined) { throw new Error("Received message for an unknown token."); } handler(message); } for (const handler of eventHandler.directHandlers) { handler(message); } }