jschan - Anonymous imageboard software. Classic look, modern features and feel. Works without JavaScript and supports Tor, I2P, Lokinet, etc.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.4 KiB

'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);
});
}