95 lines
2.2 KiB
TypeScript
95 lines
2.2 KiB
TypeScript
import { g } from "../utils/global";
|
|
import { serveAPI } from "./serve-api";
|
|
import { serveStatic } from "./serve-static";
|
|
import { serveWS } from "./serve-ws";
|
|
|
|
export const cache = {
|
|
static: {} as Record<
|
|
string,
|
|
{
|
|
type: string;
|
|
content: ArrayBuffer;
|
|
br?: ArrayBuffer;
|
|
}
|
|
>,
|
|
};
|
|
|
|
export type WSData = { url: URL };
|
|
|
|
export const createServer = async () => {
|
|
await serveAPI.init();
|
|
await serveStatic.init();
|
|
const { wsHandler } = await import("../../../app/srv/ws/handler");
|
|
|
|
g.server = Bun.serve({
|
|
port: g.port,
|
|
maxRequestBodySize: 1024 * 1024 * 128,
|
|
idleTimeout: 240, // Increase timeout to 240 seconds for large file operations (Bun limit is 255)
|
|
websocket: await serveWS(wsHandler),
|
|
async fetch(req, server) {
|
|
const url = new URL(req.url) as URL;
|
|
const prasi = {};
|
|
|
|
const handle = async (
|
|
req: Request,
|
|
opt?: {
|
|
rewrite?: (arg: {
|
|
body: Bun.BodyInit;
|
|
headers: Headers | any;
|
|
}) => Bun.BodyInit;
|
|
}
|
|
) => {
|
|
if (wsHandler[url.pathname]) {
|
|
if (
|
|
server.upgrade(req, {
|
|
data: {
|
|
url: new URL(req.url),
|
|
},
|
|
})
|
|
) {
|
|
return new Response("");
|
|
}
|
|
return new Response("Upgrade failed :(", { status: 500 });
|
|
}
|
|
|
|
if (serveStatic.exists(url)) {
|
|
return serveStatic.serve(url, opt);
|
|
} else {
|
|
try {
|
|
const response = serveStatic.serveSitePublic(url, opt);
|
|
if (response) return response;
|
|
} catch (e) {}
|
|
}
|
|
|
|
const api_response = await serveAPI.serve(url, req, prasi);
|
|
if (api_response) {
|
|
return api_response;
|
|
}
|
|
|
|
return serveStatic.serve(url, opt);
|
|
};
|
|
|
|
if (g.server_hook) {
|
|
return await g.server_hook({
|
|
url,
|
|
req,
|
|
server,
|
|
handle,
|
|
serveStatic,
|
|
serveAPI,
|
|
wsHandler,
|
|
prasi,
|
|
});
|
|
} else {
|
|
return await handle(req);
|
|
}
|
|
},
|
|
});
|
|
|
|
if (g.mode === "dev") {
|
|
g.log.info(`http://localhost:${g.server.port}`);
|
|
} else {
|
|
g.log.info(`Started at port: ${g.server.port}`);
|
|
}
|
|
};
|