107 lines
No EOL
3.1 KiB
TypeScript
107 lines
No EOL
3.1 KiB
TypeScript
import { build, serve, gzipSync, file, gc } from "bun";
|
|
|
|
import Backend from "./src/back"
|
|
|
|
import pkg from "./package.json";
|
|
|
|
|
|
let heartrate = 0;
|
|
let lanyard = {};
|
|
|
|
require("node:fs/promises").rm("./dist", { recursive: true, force: true }).catch(() => {
|
|
// ignore
|
|
});
|
|
|
|
if (!Backend.development) {
|
|
await Backend.build()
|
|
}
|
|
|
|
const server = serve({
|
|
routes: {
|
|
"/": async (req: Bun.BunRequest, server: Bun.Server) => {
|
|
await Backend.postAnalytics(req, server);
|
|
|
|
if (Backend.development) {
|
|
await Backend.build()
|
|
}
|
|
|
|
return await Backend.Responses.file(file("./dist/index.html"));
|
|
},
|
|
|
|
"/assets/:file": async (req: Bun.BunRequest<"/assets/:file">) => {
|
|
return await Backend.Responses.file(file(`./dist/${req.params.file}`));
|
|
},
|
|
|
|
"/public/:file": async (req: Bun.BunRequest<"/public/:file">) => {
|
|
return await Backend.Responses.file(file(`./public/${req.params.file}`));
|
|
},
|
|
|
|
"/api/server": () => {
|
|
const string = JSON.stringify(process)
|
|
const data = JSON.parse(string)
|
|
|
|
// clear possibly data that could be sensitive
|
|
data.env = {}
|
|
|
|
data.availableMemory = process.availableMemory()
|
|
data.constrainedMemory = process.constrainedMemory()
|
|
data.cpuUsage = process.cpuUsage()
|
|
data.memoryUsage = process.memoryUsage()
|
|
data.uptime = process.uptime()
|
|
data.package = pkg
|
|
|
|
return Backend.Responses.json({ data });
|
|
},
|
|
"/api/health": () => {
|
|
return Backend.Responses.ok();
|
|
},
|
|
"/api/ws": async (req, server) => {
|
|
if (server.upgrade(req)) {
|
|
return;
|
|
}
|
|
|
|
await Backend.postAnalytics(req, server);
|
|
return Response.redirect("/");
|
|
},
|
|
"/api/gc": async () => {
|
|
gc(true)
|
|
|
|
return Backend.Responses.ok();
|
|
},
|
|
"/api/headers": async (req) => {
|
|
return Backend.Responses.json({ ...req.headers.toJSON() });
|
|
}
|
|
},
|
|
|
|
fetch: async (request, server) => {
|
|
await Backend.postAnalytics(request, server);
|
|
|
|
return Response.redirect("/");
|
|
},
|
|
|
|
websocket: {
|
|
idleTimeout: 1,
|
|
open: async (ws) => {
|
|
ws.subscribe("lanyard");
|
|
ws.send(JSON.stringify({ type: "lanyard", data: lanyard }), true);
|
|
|
|
ws.subscribe("hyperate");
|
|
ws.send(JSON.stringify({ type: "hyperate", data: { hr: heartrate } }), true);
|
|
},
|
|
message: async (ws, message) => {
|
|
ws.send(JSON.stringify({ type: "echo", data: message }), true)
|
|
}
|
|
},
|
|
development: Backend.development,
|
|
port: 2056
|
|
});
|
|
|
|
new Backend.Sockets.Hyperate((data) => {
|
|
heartrate = data;
|
|
server.publish("hyperate", JSON.stringify({ type: "hyperate", data: { hr: heartrate } }), true);
|
|
})
|
|
|
|
new Backend.Sockets.Lanyard((data) => {
|
|
lanyard = data;
|
|
server.publish("lanyard", JSON.stringify({ type: "lanyard", data: lanyard }), true);
|
|
}); |