ai-adventure-labs/server/configHandler.js

66 lines
1.7 KiB
JavaScript

const EventEmitter = require('events');
const fs = require("fs");
const md5 = require('md5');
let logger = {
log: (...p) => console.log(...p),
error: (msg, err, level) => console.error(`Error: ${msg}\n${"=".repeat(16)}\nStack Error >>`, err.stack)
};
let fileMD5;
global.config = {};
let emitterObject = new EventEmitter();
function configValidator (cfg) {
// Any custom validation
// must be return: { condition : bool, fineConfig : confg }
return {
condition: true,
fineConfig: cfg
};
}
function setConfig (configData, isFirst = true) {
try {
fileMD5 = md5(configData);
if (!isFirst)
emitterObject.emit("config.update", {
oldConfig: Object.assign({}, global.config),
newConfig: JSON.parse(configData)
});
global.config = Object.assign({}, JSON.parse(configData));
const result = configValidator(Object.assign({}, global.config));
if (result.condition) {
global.config = result.fineConfig;
}
/*if (!config?.ip) config.ip = "0.0.0.0";
if (!config?.port) config.port = 1441;
else config.port = +config.port;*/
}
catch (err) {
logger.error("Config not parsed", err, "config-parse");
}
}
module.exports = (emitter, configObject, loggerObj = logger) => {
emitterObject = emitter;
global.config = configObject;
logger = loggerObj ?? logger;
setConfig(fs.readFileSync("./config.json", { encoding: 'utf-8' }));
// Every time checking config.json for rt-update
setInterval(async () => {
fs.readFile("./config.json", { encoding: 'utf-8' }, (err, data) => {
if (err) {
logger.error("Config not readable", err, "config-file");
}
else {
if (fileMD5 !== md5(data)) {
logger.log("Changes on file config.json detected: config will be reloaded");
setConfig(data, false);
}
}
});
}, 5);
}