UNPKG

@colyseus/core

Version:

Multiplayer Framework for Node.js.

83 lines (82 loc) 2.3 kB
// 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 };