/* eslint-disable @typescript-eslint/no-explicit-any */ import type { ServerWebSocket } from "bun"; import type { Controller, Endpoint } from "./controller/controller"; import { gameController } from "./controller/gameController"; import { db } from "./database/db"; const controllers = { game: gameController, } satisfies Record>; const userName = new WeakMap, string>(); export const setSessionUser = (ws: ServerWebSocket, user: string) => { userName.set(ws, user); }; export const handleRequest = async ( message: unknown, ws: ServerWebSocket, ) => { // TODO: Remove this const sessionUser = userName.get(ws) || "Gordon"; const ctx = { user: sessionUser, db, ws, }; if ( !message || !(typeof message === "object") || !("type" in message) || !("payload" in message) || !("id" in message) ) return; const { type, payload, id } = message; if (!(typeof type === "string")) return; const [controllerName, action] = type.split("."); if (!(controllerName in controllers)) return; try { // @ts-expect-error controllers[controllerName] is a Controller const endpoint = controllers[controllerName][action] as Endpoint; const input = endpoint.validate.parse(payload); const result = await endpoint.handler(input, ctx); ws.send(JSON.stringify({ id, payload: result })); return; } catch (_) { ws.send(JSON.stringify({ id, error: "Bad Request" })); } }; export type Routes = typeof controllers;