| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 | const CoreClass = require("../core.js");const tasks = {};const async = require("async");const fs = require("fs");const Timer = require("../classes/Timer.class");class TasksModule extends CoreClass {    constructor() {        super("tasks");    }    initialize() {        return new Promise((resolve, reject) => {            // return reject(new Error("Not fully migrated yet."));            this.cache = this.moduleManager.modules["cache"];            this.stations = this.moduleManager.modules["stations"];            this.notifications = this.moduleManager.modules["notifications"];            this.utils = this.moduleManager.modules["utils"];            //this.createTask("testTask", testTask, 5000, true);            this.runJob("CREATE_TASK", {                name: "stationSkipTask",                fn: this.checkStationSkipTask,                timeout: 1000 * 60 * 30,            });            this.runJob("CREATE_TASK", {                name: "sessionClearTask",                fn: this.sessionClearingTask,                timeout: 1000 * 60 * 60 * 6,            });            this.runJob("CREATE_TASK", {                name: "logFileSizeCheckTask",                fn: this.logFileSizeCheckTask,                timeout: 1000 * 60 * 60,            });            resolve();        });    }    CREATE_TASK(payload) {        return new Promise((resolve, reject) => {            tasks[payload.name] = {                name: payload.name,                fn: payload.fn,                timeout: payload.timeout,                lastRan: 0,                timer: null,            };            if (!payload.paused) {                this.runJob("RUN_TASK", { name: payload.name })                    .then(() => resolve())                    .catch((err) => reject(err));            } else resolve();        });    }    PAUSE_TASK(payload) {        return new Promise((resolve, reject) => {            if (tasks[payload.name].timer) tasks[name].timer.pause();            resolve();        });    }    RESUME_TASK(payload) {        return new Promise((resolve, reject) => {            tasks[payload.name].timer.resume();            resolve();        });    }    RUN_TASK(payload) {        return new Promise((resolve, reject) => {            const task = tasks[payload.name];            if (task.timer) task.timer.pause();            task.fn.apply(this).then(() => {                task.lastRan = Date.now();                task.timer = new Timer(                    () => {                        this.runJob("RUN_TASK", { name: payload.name });                    },                    task.timeout,                    false                );                resolve();            });        });    }    checkStationSkipTask(callback) {        return new Promise((resolve, reject) => {            this.log(                "INFO",                "TASK_STATIONS_SKIP_CHECK",                `Checking for stations to be skipped.`,                false            );            async.waterfall(                [                    (next) => {                        this.cache                            .runJob("HGETALL", {                                table: "stations",                            })                            .then((response) => next(null, response))                            .catch(next);                    },                    (stations, next) => {                        async.each(                            stations,                            (station, next2) => {                                if (                                    station.paused ||                                    !station.currentSong ||                                    !station.currentSong.title                                )                                    return next2();                                const timeElapsed =                                    Date.now() -                                    station.startedAt -                                    station.timePaused;                                if (timeElapsed <= station.currentSong.duration)                                    return next2();                                else {                                    this.log(                                        "ERROR",                                        "TASK_STATIONS_SKIP_CHECK",                                        `Skipping ${station._id} as it should have skipped already.`                                    );                                    this.stations                                        .runJob("INITIALIZE_STATION", {                                            stationId: station._id,                                        })                                        .then(() => {                                            next2();                                        });                                }                            },                            () => {                                next();                            }                        );                    },                ],                () => {                    resolve();                }            );        });    }    sessionClearingTask() {        return new Promise((resolve, reject) => {            this.log(                "INFO",                "TASK_SESSION_CLEAR",                `Checking for sessions to be cleared.`            );            async.waterfall(                [                    (next) => {                        this.cache                            .runJob("HGETALL", {                                table: "sessions",                            })                            .then((sessions) => {                                next(null, sessions);                            })                            .catch(next);                    },                    (sessions, next) => {                        if (!sessions) return next();                        let keys = Object.keys(sessions);                        async.each(                            keys,                            (sessionId, next2) => {                                let session = sessions[sessionId];                                if (                                    session &&                                    session.refreshDate &&                                    Date.now() - session.refreshDate <                                        60 * 60 * 24 * 30 * 1000                                )                                    return next2();                                if (!session) {                                    this.log(                                        "INFO",                                        "TASK_SESSION_CLEAR",                                        "Removing an empty session."                                    );                                    this.cache                                        .runJob("HDEL", {                                            table: "sessions",                                            key: sessionId,                                        })                                        .finally(() => next2());                                } else if (!session.refreshDate) {                                    session.refreshDate = Date.now();                                    this.cache                                        .runJob("HSET", {                                            table: "sessions",                                            key: sessionId,                                            value: session,                                        })                                        .finally(() => next2());                                } else if (                                    Date.now() - session.refreshDate >                                    60 * 60 * 24 * 30 * 1000                                ) {                                    this.utils                                        .runJob("SOCKETS_FROM_SESSION_ID", {                                            sessionId: session.sessionId,                                        })                                        .then((response) => {                                            if (response.sockets.length > 0) {                                                session.refreshDate = Date.now();                                                this.cache                                                    .runJob("HSET", {                                                        table: "sessions",                                                        key: sessionId,                                                        value: session,                                                    })                                                    .finally(() => next2());                                            } else {                                                this.log(                                                    "INFO",                                                    "TASK_SESSION_CLEAR",                                                    `Removing session ${sessionId} for user ${session.userId} since inactive for 30 days and not currently in use.`                                                );                                                this.cache                                                    .runJob("HDEL", {                                                        table: "sessions",                                                        key: session.sessionId,                                                    })                                                    .finally(() => next2());                                            }                                        });                                } else {                                    this.log(                                        "ERROR",                                        "TASK_SESSION_CLEAR",                                        "This should never log."                                    );                                    next2();                                }                            },                            () => {                                next();                            }                        );                    },                ],                () => {                    resolve();                }            );        });    }    logFileSizeCheckTask() {        return new Promise((resolve, reject) => {            this.log(                "INFO",                "TASK_LOG_FILE_SIZE_CHECK",                `Checking the size for the log files.`            );            async.each(                [                    "all.log",                    "debugStation.log",                    "error.log",                    "info.log",                    "success.log",                ],                (fileName, next) => {                    const stats = fs.statSync(                        `${__dirname}/../../log/${fileName}`                    );                    const mb = stats.size / 1000000;                    if (mb > 25) return next(true);                    else next();                },                (err) => {                    if (err === true) {                        this.log(                            "ERROR",                            "LOGGER_FILE_SIZE_WARNING",                            "************************************WARNING*************************************"                        );                        this.log(                            "ERROR",                            "LOGGER_FILE_SIZE_WARNING",                            "***************ONE OR MORE LOG FILES APPEAR TO BE MORE THAN 25MB****************"                        );                        this.log(                            "ERROR",                            "LOGGER_FILE_SIZE_WARNING",                            "****MAKE SURE TO REGULARLY CLEAR UP THE LOG FILES, MANUALLY OR AUTOMATICALLY****"                        );                        this.log(                            "ERROR",                            "LOGGER_FILE_SIZE_WARNING",                            "********************************************************************************"                        );                    }                    resolve();                }            );        });    }}module.exports = new TasksModule();
 |