Client/api/src/services/serverService.js

63 lines
1.5 KiB
JavaScript

const GameServer = require("../models/GameServer");
const registerGameServer = async (serverData) => {
const { name, url, region, description } = serverData;
const server = await GameServer.findOneAndUpdate(
{ name },
{
url,
lastHeartbeat: Date.now(),
status: "online",
description,
region,
},
{ upsert: true, returnDocument: "after" },
);
console.log(`📡 [REGISTRY] Game Server "${name}" at ${url} is now ONLINE`);
return server;
};
const updateHeartbeat = async (name, playersOnline) => {
return await GameServer.findOneAndUpdate(
{ name },
{
lastHeartbeat: Date.now(),
status: "online",
playersOnline: playersOnline,
},
);
};
const checkServerHealth = async () => {
const timeout = new Date(Date.now() - 60000);
const result = await GameServer.updateMany(
{ lastHeartbeat: { $lt: timeout }, status: "online" },
{ status: "offline" },
);
if (result.modifiedCount > 0) {
console.log(`[CLEANUP] Marked ${result.modifiedCount} servers as OFFLINE`);
}
};
const getAvailableServers = async () => {
return await GameServer.find({}).select(
"name url playersOnline status maxPlayers",
);
};
const getServerConnectionDetails = async (serverId) => {
return await GameServer.findOne({ _id: serverId, status: "online" }).select(
"name url port region description",
);
};
setInterval(checkServerHealth, 60000);
module.exports = {
registerGameServer,
updateHeartbeat,
getAvailableServers,
getServerConnectionDetails,
};