about summary refs log tree commit diff
path: root/assets/src/network/channel/messages/message_handler.ts
diff options
context:
space:
mode:
Diffstat (limited to 'assets/src/network/channel/messages/message_handler.ts')
-rw-r--r--assets/src/network/channel/messages/message_handler.ts25
1 files changed, 25 insertions, 0 deletions
diff --git a/assets/src/network/channel/messages/message_handler.ts b/assets/src/network/channel/messages/message_handler.ts
new file mode 100644
index 0000000..2aefa1d
--- /dev/null
+++ b/assets/src/network/channel/messages/message_handler.ts
@@ -0,0 +1,25 @@
+import type { AnyMessage, RequestMessage, ShareMessage } from "./messages";
+
+export type HandlerFn<Message> = (message: Message) => void;
+
+export type MessageHandler<Messages extends AnyMessage> = {
+    [M in Messages as M["event_name"]]?: HandlerFn<M>;
+};
+
+export type RequestMessageHandler = MessageHandler<RequestMessage>;
+export type ShareMessageHandler = MessageHandler<ShareMessage>;
+
+const defaultHandlerFn: HandlerFn<AnyMessage> = m => {
+    console.error(
+        `Received unknown event "${m.event_name}": ${JSON.stringify(m)}`
+    );
+};
+
+export function routeEventToHandler(
+    event: string,
+    message: any,
+    handlers: MessageHandler<AnyMessage>
+): void {
+    const handler = handlers[event] || defaultHandlerFn;
+    handler(message);
+}