import { createRouter } from "radix3"; import { wsHandler } from "../../../app/srv/ws/handler"; import { dir } from "../utils/dir"; import { g } from "../utils/global"; import { serveAPI } from "./serve-api"; import { WebSocketHandler } from "bun"; const cache = { static: {} as Record }; export const createServer = async () => { g.api = {}; g.router = createRouter({ strictTrailingSlash: true }); g.server = Bun.serve({ port: g.port, websocket: { close(ws, code, reason) { const pathname = ws.data.url.pathname; if (wsHandler[pathname]) { const close = wsHandler[pathname].close; if (close) { close(ws, code, reason); } } }, message(ws, message) { const pathname = ws.data.url.pathname; if (wsHandler[pathname]) { const msg = wsHandler[pathname].message; if (msg) { msg(ws, message); } } }, open(ws) { const pathname = ws.data.url.pathname; if (wsHandler[pathname]) { const open = wsHandler[pathname].open; if (open) { open(ws); } } }, } as WebSocketHandler<{ url: URL }>, async fetch(req, server) { if (g.status === "init") return new Response("initializing..."); const url = new URL(req.url); if (wsHandler[url.pathname]) { if ( server.upgrade(req, { data: { url: new URL(req.url), }, }) ) { return; } return new Response("Upgrade failed :(", { status: 500 }); } try { const api = await serveAPI(url, req); if (api) { return api; } } catch (e) { g.log.error(e); } try { if (cache.static[url.pathname]) { return new Response(cache.static[url.pathname]); } const file = Bun.file(dir.path(`app/static${url.pathname}`)); if ((await file.exists()) && file.type !== "application/octet-stream") { cache.static[url.pathname] = file; return new Response(file as any); } } catch (e) { g.log.error(e); } try { return new Response(Bun.file(dir.path(`app/static/index.html`)) as any); } catch (e) { g.log.error(e); return new Response("Loading..."); } }, }); if (g.mode === "dev") { g.log.info(`http://localhost:${g.server.port}`); } else { g.log.info(`Started at port: ${g.server.port}`); } };