Files
EpicNext-Cms/src/app/api/admin/devops/health/route.ts
T

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