From 867ce63f7bc67cb418d96d226a7e3eaf2b05bc87 Mon Sep 17 00:00:00 2001 From: Party Wumpus <48649272+PartyWumpus@users.noreply.github.com> Date: Thu, 15 Feb 2024 22:28:36 +0000 Subject: Add event handler --- frontend/src/wsrouter.ts | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'frontend/src/wsrouter.ts') diff --git a/frontend/src/wsrouter.ts b/frontend/src/wsrouter.ts index 32037eaf..aada457c 100644 --- a/frontend/src/wsrouter.ts +++ b/frontend/src/wsrouter.ts @@ -34,7 +34,13 @@ interface ErrorMessage { id: number; } -type Message = CallMessage | ReplyMessage | ErrorMessage; +interface EventMessage { + type: MessageType.EVENT; + event: string; + args: any; +} + +type Message = CallMessage | ReplyMessage | ErrorMessage | EventMessage; // Helper to resolve a promise from the outside interface PromiseResolver { @@ -46,6 +52,7 @@ interface PromiseResolver { export class WSRouter extends Logger { routes: Map any> = new Map(); runningCalls: Map> = new Map(); + eventListeners: Map any>> = new Map(); ws?: WebSocket; connectPromise?: Promise; // Used to map results and errors to calls @@ -87,7 +94,7 @@ export class WSRouter extends Logger { this.ws?.send(JSON.stringify(data)); } - addRoute(name: string, route: (args: any) => any) { + addRoute(name: string, route: (...args: any) => any) { this.routes.set(name, route); } @@ -95,6 +102,25 @@ export class WSRouter extends Logger { this.routes.delete(name); } + addEventListener(event: string, listener: (...args: any) => any) { + if (!this.eventListeners.has(event)) { + this.eventListeners.set(event, new Set([listener])); + } else { + this.eventListeners.get(event)?.add(listener); + } + return listener; + } + + removeEventListener(event: string, listener: (...args: any) => any) { + if (this.eventListeners.has(event)) { + const set = this.eventListeners.get(event); + set?.delete(listener); + if (set?.size === 0) { + this.eventListeners.delete(event); + } + } + } + async onMessage(msg: MessageEvent) { try { const data = JSON.parse(msg.data) as Message; @@ -129,6 +155,20 @@ export class WSRouter extends Logger { } break; + case MessageType.EVENT: + if (this.eventListeners.has(data.event)) { + for (const listener of this.eventListeners.get(data.event)!) { + try { + listener(...data.args); + } catch (e) { + this.error(`error in event ${data.event}`, e, listener); + } + } + } else { + this.debug(`event ${data.event} has no listeners`); + } + break; + default: this.error('Unknown message type', data); break; -- cgit v1.2.3