{
  "version": 3,
  "sources": ["../src/Stats.ts"],
  "sourcesContent": ["import { MatchMakerState, presence, processId, state } from './MatchMaker.ts';\n\nexport type Stats = {\n  roomCount: number;\n  ccu: number;\n}\n\nexport let local: Stats = {\n  roomCount: 0,\n  ccu: 0,\n};\n\nexport async function fetchAll() {\n  // TODO: cache this value to avoid querying too often\n  const allStats: Array<Stats & { processId: string }> = [];\n  const allProcesses = await presence.hgetall(getRoomCountKey());\n\n  for (let remoteProcessId in allProcesses) {\n    if (remoteProcessId === processId) {\n      allStats.push({ processId, roomCount: local.roomCount, ccu: local.ccu, });\n\n    } else {\n      const [roomCount, ccu] = allProcesses[remoteProcessId].split(',').map(Number);\n      allStats.push({ processId: remoteProcessId, roomCount, ccu });\n    }\n  }\n\n  return allStats;\n}\n\nlet lastPersisted = 0;\nlet persistTimeout = undefined;\nconst persistInterval = 1000;\n\nexport function persist(forceNow: boolean = false) {\n  // skip if shutting down\n  if (state === MatchMakerState.SHUTTING_DOWN) {\n    return;\n  }\n\n  /**\n   * Avoid persisting more than once per second.\n   */\n  const now = Date.now();\n\n  if (forceNow || (now - lastPersisted > persistInterval)) {\n    lastPersisted = now;\n    return presence.hset(getRoomCountKey(), processId, `${local.roomCount},${local.ccu}`);\n\n  } else {\n    clearTimeout(persistTimeout);\n    persistTimeout = setTimeout(persist, persistInterval);\n  }\n}\n\nexport function reset(_persist: boolean = true) {\n  local.roomCount = 0;\n  local.ccu = 0;\n\n  if (_persist) {\n    lastPersisted = 0;\n    clearTimeout(persistTimeout);\n    persist();\n  }\n\n  //\n  // Attach local metrics to PM2 (if available)\n  //\n  import('@pm2/io').then((io) => {\n    io.default.metric({ id: 'app/stats/ccu', name: 'ccu', value: () => local.ccu });\n    io.default.metric({ id: 'app/stats/roomcount', name: 'roomcount', value: () => local.roomCount });\n  }).catch(() => { });\n}\n\nexport function excludeProcess(_processId: string) {\n  return presence.hdel(getRoomCountKey(), _processId);\n}\n\nexport async function getGlobalCCU() {\n  const allStats = await fetchAll();\n  return allStats.reduce((prev, next) => prev + next.ccu, 0);\n}\n\n/**\n * Auto-persist every minute.\n */\nlet autoPersistInterval = undefined;\n\nexport function setAutoPersistInterval() {\n  const interval = 60 * 1000;// 1 minute\n\n  autoPersistInterval = setInterval(() => {\n    const now = Date.now();\n\n    if (now - lastPersisted > interval) {\n      persist();\n    }\n  }, interval);\n}\n\nexport function clearAutoPersistInterval() {\n  clearInterval(autoPersistInterval);\n}\n\nfunction getRoomCountKey() {\n  return 'roomcount';\n}"],
  "mappings": ";AAAA,SAAS,iBAAiB,UAAU,WAAW,aAAa;AAOrD,IAAI,QAAe;AAAA,EACxB,WAAW;AAAA,EACX,KAAK;AACP;AAEA,eAAsB,WAAW;AAE/B,QAAM,WAAiD,CAAC;AACxD,QAAM,eAAe,MAAM,SAAS,QAAQ,gBAAgB,CAAC;AAE7D,WAAS,mBAAmB,cAAc;AACxC,QAAI,oBAAoB,WAAW;AACjC,eAAS,KAAK,EAAE,WAAW,WAAW,MAAM,WAAW,KAAK,MAAM,IAAK,CAAC;AAAA,IAE1E,OAAO;AACL,YAAM,CAAC,WAAW,GAAG,IAAI,aAAa,eAAe,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAC5E,eAAS,KAAK,EAAE,WAAW,iBAAiB,WAAW,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAI,gBAAgB;AACpB,IAAI,iBAAiB;AACrB,IAAM,kBAAkB;AAEjB,SAAS,QAAQ,WAAoB,OAAO;AAEjD,MAAI,UAAU,gBAAgB,eAAe;AAC3C;AAAA,EACF;AAKA,QAAM,MAAM,KAAK,IAAI;AAErB,MAAI,YAAa,MAAM,gBAAgB,iBAAkB;AACvD,oBAAgB;AAChB,WAAO,SAAS,KAAK,gBAAgB,GAAG,WAAW,GAAG,MAAM,SAAS,IAAI,MAAM,GAAG,EAAE;AAAA,EAEtF,OAAO;AACL,iBAAa,cAAc;AAC3B,qBAAiB,WAAW,SAAS,eAAe;AAAA,EACtD;AACF;AAEO,SAAS,MAAM,WAAoB,MAAM;AAC9C,QAAM,YAAY;AAClB,QAAM,MAAM;AAEZ,MAAI,UAAU;AACZ,oBAAgB;AAChB,iBAAa,cAAc;AAC3B,YAAQ;AAAA,EACV;AAKA,SAAO,SAAS,EAAE,KAAK,CAAC,OAAO;AAC7B,OAAG,QAAQ,OAAO,EAAE,IAAI,iBAAiB,MAAM,OAAO,OAAO,MAAM,MAAM,IAAI,CAAC;AAC9E,OAAG,QAAQ,OAAO,EAAE,IAAI,uBAAuB,MAAM,aAAa,OAAO,MAAM,MAAM,UAAU,CAAC;AAAA,EAClG,CAAC,EAAE,MAAM,MAAM;AAAA,EAAE,CAAC;AACpB;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAO,SAAS,KAAK,gBAAgB,GAAG,UAAU;AACpD;AAEA,eAAsB,eAAe;AACnC,QAAM,WAAW,MAAM,SAAS;AAChC,SAAO,SAAS,OAAO,CAAC,MAAM,SAAS,OAAO,KAAK,KAAK,CAAC;AAC3D;AAKA,IAAI,sBAAsB;AAEnB,SAAS,yBAAyB;AACvC,QAAM,WAAW,KAAK;AAEtB,wBAAsB,YAAY,MAAM;AACtC,UAAM,MAAM,KAAK,IAAI;AAErB,QAAI,MAAM,gBAAgB,UAAU;AAClC,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,QAAQ;AACb;AAEO,SAAS,2BAA2B;AACzC,gBAAc,mBAAmB;AACnC;AAEA,SAAS,kBAAkB;AACzB,SAAO;AACT;",
  "names": []
}
