102 lines
2.6 KiB
TypeScript
102 lines
2.6 KiB
TypeScript
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<string, any> };
|
|
|
|
export type WSData = { url: URL };
|
|
|
|
export const createServer = async () => {
|
|
g.api = {};
|
|
g.router = createRouter({ strictTrailingSlash: true });
|
|
g.server = Bun.serve({
|
|
port: g.port,
|
|
websocket: {
|
|
maxPayloadLength: 9999999,
|
|
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<WSData>,
|
|
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}`);
|
|
}
|
|
};
|