@colyseus/core
Version:
Multiplayer Framework for Node.js.
83 lines (82 loc) • 2.3 kB
JavaScript
// packages/core/src/Stats.ts
import { MatchMakerState, presence, processId, state } from "./MatchMaker.mjs";
var local = {
roomCount: 0,
ccu: 0
};
async function fetchAll() {
const allStats = [];
const allProcesses = await presence.hgetall(getRoomCountKey());
for (let remoteProcessId in allProcesses) {
if (remoteProcessId === processId) {
allStats.push({ processId, roomCount: local.roomCount, ccu: local.ccu });
} else {
const [roomCount, ccu] = allProcesses[remoteProcessId].split(",").map(Number);
allStats.push({ processId: remoteProcessId, roomCount, ccu });
}
}
return allStats;
}
var lastPersisted = 0;
var persistTimeout = void 0;
var persistInterval = 1e3;
function persist(forceNow = false) {
if (state === MatchMakerState.SHUTTING_DOWN) {
return;
}
const now = Date.now();
if (forceNow || now - lastPersisted > persistInterval) {
lastPersisted = now;
return presence.hset(getRoomCountKey(), processId, `${local.roomCount},${local.ccu}`);
} else {
clearTimeout(persistTimeout);
persistTimeout = setTimeout(persist, persistInterval);
}
}
function reset(_persist = true) {
local.roomCount = 0;
local.ccu = 0;
if (_persist) {
lastPersisted = 0;
clearTimeout(persistTimeout);
persist();
}
import("@pm2/io").then((io) => {
io.default.metric({ id: "app/stats/ccu", name: "ccu", value: () => local.ccu });
io.default.metric({ id: "app/stats/roomcount", name: "roomcount", value: () => local.roomCount });
}).catch(() => {
});
}
function excludeProcess(_processId) {
return presence.hdel(getRoomCountKey(), _processId);
}
async function getGlobalCCU() {
const allStats = await fetchAll();
return allStats.reduce((prev, next) => prev + next.ccu, 0);
}
var autoPersistInterval = void 0;
function setAutoPersistInterval() {
const interval = 60 * 1e3;
autoPersistInterval = setInterval(() => {
const now = Date.now();
if (now - lastPersisted > interval) {
persist();
}
}, interval);
}
function clearAutoPersistInterval() {
clearInterval(autoPersistInterval);
}
function getRoomCountKey() {
return "roomcount";
}
export {
clearAutoPersistInterval,
excludeProcess,
fetchAll,
getGlobalCCU,
local,
persist,
reset,
setAutoPersistInterval
};