summaryrefslogtreecommitdiff
path: root/frontend/src/wsrouter.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/wsrouter.ts')
-rw-r--r--frontend/src/wsrouter.ts44
1 files changed, 42 insertions, 2 deletions
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<T> {
@@ -46,6 +52,7 @@ interface PromiseResolver<T> {
export class WSRouter extends Logger {
routes: Map<string, (...args: any) => any> = new Map();
runningCalls: Map<number, PromiseResolver<any>> = new Map();
+ eventListeners: Map<string, Set<(...args: any) => any>> = new Map();
ws?: WebSocket;
connectPromise?: Promise<void>;
// 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;