63 lines
1.5 KiB
JavaScript
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,
|
|
};
|