taskworker: only support async workers

This commit is contained in:
Girish Ramakrishnan
2022-04-15 17:40:46 -05:00
parent 5f2492558d
commit 26f9635a38

View File

@@ -16,8 +16,7 @@ const apptask = require('./apptask.js'),
safe = require('safetydance'),
settings = require('./settings.js'),
tasks = require('./tasks.js'),
updater = require('./updater.js'),
util = require('util');
updater = require('./updater.js');
const TASKS = { // indexed by task type
app: apptask.run,
@@ -30,10 +29,10 @@ const TASKS = { // indexed by task type
changeMailLocation: mail.changeLocation,
syncDnsRecords: dns.syncDnsRecords,
_identity: (arg, progressCallback, callback) => callback(null, arg),
_error: (arg, progressCallback, callback) => callback(new Error(`Failed for arg: ${arg}`)),
_crash: (arg) => { throw new Error(`Crashing for arg: ${arg}`); }, // the test looks for this debug string in the log file
_sleep: (arg) => setTimeout(process.exit, arg)
_identity: async (arg, progressCallback) => { progressCallback(); return arg; },
_error: async (arg, progressCallback) => { progressCallback(); throw new Error(`Failed for arg: ${arg}`); },
_crash: async (arg) => { throw new Error(`Crashing for arg: ${arg}`); }, // the test looks for this debug string in the log file
_sleep: async (arg) => setTimeout(process.exit, arg)
};
if (process.argv.length !== 4) {
@@ -69,9 +68,9 @@ async.series([
setupLogging,
database.initialize,
settings.initCache
], async function (error) {
if (error) {
console.error(error);
], async function (initError) {
if (initError) {
console.error(initError);
return process.exit(50);
}
@@ -88,31 +87,21 @@ async.series([
if (getError) return exitSync({ error: getError, code: 50 });
if (!task) return exitSync({ error: new Error(`Task ${taskId} not found`), code: 50 });
const progressCallback = async function (progress, callback) {
async function progressCallback(progress) {
await safe(tasks.update(taskId, progress), { debug });
if (callback) callback();
};
}
const resultCallback = async (error, result) => {
// Error object has properties with enumerable: false (https://mattcbaker.com/posts/stringify-javascript-error/)
try {
const [runError, result] = await safe(TASKS[task.type].apply(null, task.args.concat(progressCallback)));
const progress = {
result: result || null,
error: error ? JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error))) : null
error: runError ? JSON.parse(JSON.stringify(runError, Object.getOwnPropertyNames(runError))) : null
};
debug(`Task took ${(new Date() - startTime)/1000} seconds`);
await safe(tasks.setCompleted(taskId, progress));
exitSync({ error, code: error ? 50 : 0 });
};
try {
if (util.types.isAsyncFunction(TASKS[task.type])) { // can also use fn[Symbol.toStringTag]
const [error, result] = await safe(TASKS[task.type].apply(null, task.args.concat(progressCallback)));
await resultCallback(error, result);
} else {
TASKS[task.type].apply(null, task.args.concat(progressCallback).concat(resultCallback));
}
exitSync({ error: runError, code: runError ? 50 : 0 });
} catch (error) {
exitSync({ error, code: 1 }); // do not call setCompleted() intentionally. the task code must be resilient enough to handle it
}