123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- 'use strict';
- const cache = require("./cache");
- const logger = require("./logger");
- const Stations = require("./stations");
- const notifications = require("./notifications");
- const async = require("async");
- let utils;
- let tasks = {};
- let testTask = (callback) => {
- //Stuff
- console.log("Starting task");
- setTimeout(() => {
- console.log("Callback");
- callback();
- }, 10000);
- };
- let checkStationSkipTask = (callback) => {
- logger.info("TASK_STATIONS_SKIP_CHECK", `Checking for stations to be skipped.`, false);
- async.waterfall([
- (next) => {
- cache.hgetall('stations', 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 {
- logger.error("TASK_STATIONS_SKIP_CHECK", `Skipping ${station._id} as it should have skipped already.`);
- Stations.initializeStation(station._id);
- next2();
- }
- }, () => {
- next();
- });
- }
- ], () => {
- callback();
- });
- };
- let sessionClearingTask = (callback) => {
- logger.info("TASK_SESSION_CLEAR", `Checking for sessions to be cleared.`, false);
- async.waterfall([
- (next) => {
- cache.hgetall('sessions', 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) {
- logger.info("TASK_SESSION_CLEAR", 'Removing an empty session.');
- cache.hdel('sessions', sessionId, () => {
- next2();
- });
- } else if (!session.refreshDate) {
- session.refreshDate = Date.now();
- cache.hset('sessions', sessionId, session, () => {
- next2();
- });
- } else if ((Date.now() - session.refreshDate) > (60 * 60 * 24 * 30 * 1000)) {
- utils.socketsFromSessionId(session.sessionId, (sockets) => {
- if (sockets.length > 0) {
- session.refreshDate = Date.now();
- cache.hset('sessions', sessionId, session, () => {
- next2()
- });
- } else {
- logger.info("TASK_SESSION_CLEAR", `Removing session ${sessionId} for user ${session.userId} since inactive for 30 days and not currently in use.`);
- cache.hdel('sessions', session.sessionId, () => {
- next2();
- });
- }
- });
- } else {
- logger.error("TASK_SESSION_CLEAR", "This should never log.");
- next2();
- }
- }, () => {
- next();
- });
- }
- ], () => {
- callback();
- });
- };
- let initialized = false;
- let lockdown = false;
- module.exports = {
- init: function(cb) {
- utils = require('./utils');
- this.createTask("testTask", testTask, 5000, true);
- this.createTask("stationSkipTask", checkStationSkipTask, 1000 * 60 * 30);
- this.createTask("sessionClearTask", sessionClearingTask, 1000 * 60 * 60 * 6);
- initialized = true;
- if (lockdown) return this._lockdown();
- cb();
- },
- createTask: function(name, fn, timeout, paused = false) {
- if (lockdown) return;
- tasks[name] = {
- name,
- fn,
- timeout,
- lastRan: 0,
- timer: null
- };
- if (!paused) this.handleTask(tasks[name]);
- },
- pauseTask: (name) => {
- if (tasks[name].timer) tasks[name].timer.pause();
- },
- resumeTask: (name) => {
- tasks[name].timer.resume();
- },
- handleTask: function(task) {
- if (lockdown) return;
- if (task.timer) task.timer.pause();
- task.fn(() => {
- task.lastRan = Date.now();
- task.timer = new utils.Timer(() => {
- this.handleTask(task);
- }, task.timeout, false);
- });
- },
- _lockdown: function() {
- for (let key in tasks) {
- this.pauseTask(key);
- }
- tasks = {};
- lockdown = true;
- }
- };
|