60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
import net from "node:net";
|
|
import { NextResponse } from "next/server";
|
|
import { env } from "@/env";
|
|
import { withAdmin } from "@/lib/api-handler";
|
|
import { PERMS } from "@/lib/permissions";
|
|
import { prisma } from "@/lib/prisma";
|
|
|
|
function checkRcon(): Promise<boolean> {
|
|
return new Promise((resolve) => {
|
|
const host = env.RCON_HOST;
|
|
const port = env.RCON_PORT;
|
|
|
|
const socket = new net.Socket();
|
|
const timeout = setTimeout(() => {
|
|
socket.destroy();
|
|
resolve(false);
|
|
}, 3000);
|
|
|
|
socket.connect(port, host, () => {
|
|
clearTimeout(timeout);
|
|
socket.destroy();
|
|
resolve(true);
|
|
});
|
|
|
|
socket.on("error", () => {
|
|
clearTimeout(timeout);
|
|
socket.destroy();
|
|
resolve(false);
|
|
});
|
|
});
|
|
}
|
|
|
|
export const GET = withAdmin({ permission: PERMS.DEVOPS_VIEW }, async () => {
|
|
// DB health
|
|
let dbOk = false;
|
|
let dbLatency = 0;
|
|
try {
|
|
const start = Date.now();
|
|
await prisma.$queryRaw`SELECT 1`;
|
|
dbLatency = Date.now() - start;
|
|
dbOk = true;
|
|
} catch {
|
|
dbOk = false;
|
|
}
|
|
|
|
// Emulator health (RCON TCP check)
|
|
const emulator = await checkRcon();
|
|
|
|
// Online users
|
|
const onlineUsers = await prisma.user.count({ where: { online: "1" } });
|
|
|
|
return NextResponse.json({
|
|
database: dbOk,
|
|
dbLatency,
|
|
emulator,
|
|
onlineUsers,
|
|
timestamp: new Date().toISOString(),
|
|
});
|
|
});
|