systemquery/src/lib/core/InfoBroker.mjs
Starbeamrainbowlabs 9ac878f261
InfoBroker: add initial meta table.
This particular table contains information about the currently running 
systemquery instance.

TODO: Add other interesting things such as # of connected peers etc.
2022-01-31 03:05:12 +00:00

56 lines
1.4 KiB
JavaScript

"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.sym_meta = Symbol("____meta_info____")
this.allowed_tables = {
// name → sysinfo name
cpu: "cpu",
meta: this.sym_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(name_translated === this.sym_meta)
return await this.make_table_meta();
return await sysinfo[name_translated]();
}
}
export default InfoBroker;