"use strict"; import path from 'path'; import fs from 'fs'; import sysinfo from 'systeminformation'; import log from '../../lib/io/NamespacedLog.mjs'; const l = log("infobroker"); // HACK: Make sure __dirname is defined when using es6 modules. I forget where I found this - a PR with a source URL would be great :D const __dirname = import.meta.url.slice(7, import.meta.url.lastIndexOf("/")); class InfoBroker { constructor() { this.allowed_tables = { // name → sysinfo name cpu: "cpu", cpu_live: async () => { return { frequency: await sysinfo.cpuCurrentSpeed(), temperature: await sysinfo.cpuTemperature() }; }, meta: async () => await this.make_table_meta() }; } is_valid_table(name) { return Object.keys(this.allowed_tables).includes(name); } async make_table_meta() { return { version: JSON.parse(fs.promises.readFile(path.resolve(__dirname, "../../../package.json"), "utf-8")).version, versions_env: process.versions, pid: process.pid, uptime: process.uptime(), memory: process.memoryUsage(), }; } async fetch_table(name) { if(!(typeof name === "string")) throw new Exception(`Error: Expected name to be of type string, but received value of type ${typeof name} instead.`); if(!this.is_valid_table(name)) { l.warn(`Unrecognised table '${name}' requested, returning null`); return null; } let name_translated = this.allowed_tables[name]; if(typeof name_translated === "function") return await name_translated(); return await sysinfo[name_translated](); } } export default InfoBroker;