ipv4.army/index.ts
2025-05-04 20:47:19 -04:00

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);
});