prasi-bun/pkgs/core/server/create.ts

99 lines
2.5 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 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}`);
}
};