config-save.js 1.99 KB
const MODULE_NAME = 'KOMODO-SDK.API-SERVER.CONFIG-SAVE';

const fs = require('fs');
const locks = require('locks');
const moment = require('moment');
const logger = require('tektrans-logger');
const config = require('../config');
const matrix = require('../matrix');

if (!fs.existsSync('config-backup')) fs.mkdirSync('config-backup');

const mutex = locks.createMutex();

const backup = async (xid) => {
    try {
        const backupFilename = `config-backup/config_${moment().format('YYYYMMDD_HHmmss.SS')}.json`;
        await fs.promises.copyFile('config.json', backupFilename);
        logger.verbose(`${MODULE_NAME} 88213811: Backup saved`, {
            xid,
            backupFilename,
        });

        return backupFilename;
    } catch (e) {
        const newE = new Error(`${MODULE_NAME} 0257A553: Exception on backup`);
        newE.code = 'E_BACKUP_CONFIG';

        logger.warn(newE.message, {
            xid,
            eCode: e.code,
            eMessage: e.message || e,
        });

        throw newE;
    }
};

module.exports = async (xid) => {
    if (!matrix.config_is_dirty) {
        logger.verbose(`${MODULE_NAME} 4B263CB4: No need to save because config is not dirty`, { xid });
        return;
    }

    await new Promise((resolve) => {
        mutex.lock(() => {
            resolve();
        });
    });

    try {
        const backupFilename = await backup(xid);

        await fs.promises.writeFile(
            'config.json',
            `${JSON.stringify(config, null, 2)}\n`,
            { mode: 0o640 },
        );

        matrix.config_is_dirty = false;

        logger.verbose(`${MODULE_NAME} DE655EEF: Config saved`, { xid, backupFilename });
    } catch (e) {
        const newE = new Error(`${MODULE_NAME} CD9C1BE1: Exception on saving config file`);
        newE.code = 'E_SAVE_CONFIG';

        logger.warn(newE.message, {
            xid,
            eCode: e.code,
            eMessage: e.message || e,
        });

        throw newE;
    } finally {
        mutex.unlock();
    }
};