'use strict'; process .on('uncaughtException', console.error) .on('unhandledRejection', console.error); const RedisSMQ = require('rsmq') , configs = require(__dirname+'/configs/main.json') , { redisClient } = require(__dirname+'/redis.js') , rsmq = new RedisSMQ({ ns: 'rsmq', client: redisClient }) , queuename = 'generate' , Mongo = require(__dirname+'/db/db.js') , Mutex = require(__dirname+'/mutex.js'); let buildTasks = {} , interval = 100; (async () => { await Mongo.connect(); await Mutex.connect(); buildTasks = require(__dirname+'/helpers/build.js'); rsmq.createQueue({ qname: queuename }, (err) => { if (err && err.name !== 'queueExists') { return console.error(err); } setTimeout(processQueueLoop, interval); }); })(); function processQueueLoop() { rsmq.receiveMessage({ qname: queuename }, async (err, resp) => { if (err) { return console.error(err); } if (resp.id) { interval = 100; //keeps queue checking fast when there are tasks const message = JSON.parse(resp.message); await buildTasks[message.task](message.options); rsmq.deleteMessage({ qname: queuename, id: resp.id }, (err) => { if (err) { return console.error(err); } //message deleted successfully }); } else { //max 2 sec poll time if (interval < 2000) { //slow down queue when empty interval += 100; } } setTimeout(processQueueLoop, interval); }); }