Adds new tile on the admin home page with system data. (#301)
* Adds new tile on the admin home page with system data. Also fixes the active users bug in the pie chart * Fixes missing parentheses * Updates user stats cache when signing in * Reads active number of users from session provider * Removes unused variable * Small improvements * Removes acl properties from system data websocket and performs initial push of data * fix: remove acl fetch --------- Co-authored-by: DecDuck <declanahofmeyr@gmail.com>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import os from "os";
|
||||
|
||||
export type SystemData = {
|
||||
totalRam: number;
|
||||
freeRam: number;
|
||||
cpuLoad: number;
|
||||
cpuCores: number;
|
||||
};
|
||||
|
||||
class SystemManager {
|
||||
// userId to acl to listenerId
|
||||
private listeners = new Map<
|
||||
string,
|
||||
Map<string, { callback: (systemData: SystemData) => void }>
|
||||
>();
|
||||
|
||||
listen(
|
||||
userId: string,
|
||||
id: string,
|
||||
callback: (systemData: SystemData) => void,
|
||||
) {
|
||||
if (!this.listeners.has(userId)) this.listeners.set(userId, new Map());
|
||||
// eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion
|
||||
this.listeners.get(userId)!!.set(id, { callback });
|
||||
this.pushUpdate(userId, id);
|
||||
setInterval(() => this.pushUpdate(userId, id), 3000);
|
||||
}
|
||||
|
||||
unlisten(userId: string, id: string) {
|
||||
this.listeners.get(userId)?.delete(id);
|
||||
}
|
||||
|
||||
private async pushUpdate(userId: string, id: string) {
|
||||
const listener = this.listeners.get(userId)?.get(id);
|
||||
if (!listener) {
|
||||
throw new Error("Failed to catch-up listener: callback does not exist");
|
||||
}
|
||||
listener.callback(this.getSystemData());
|
||||
}
|
||||
|
||||
getSystemData(): SystemData {
|
||||
return {
|
||||
cpuLoad: this.cpuLoad(),
|
||||
totalRam: os.totalmem(),
|
||||
freeRam: os.freemem(),
|
||||
cpuCores: os.cpus().length,
|
||||
};
|
||||
}
|
||||
|
||||
private cpuLoad() {
|
||||
const [oneMinLoad, _fiveMinLoad, _fiftenMinLoad] = os.loadavg();
|
||||
const numberCpus = os.cpus().length;
|
||||
return 100 - ((numberCpus - oneMinLoad) / numberCpus) * 100;
|
||||
}
|
||||
}
|
||||
|
||||
export const systemManager = new SystemManager();
|
||||
export default systemManager;
|
||||
Reference in New Issue
Block a user