sails-hook-jobmanager
Version:
A sails hook to schedule and run server side jobs.
142 lines (112 loc) • 4.32 kB
JavaScript
/**
* Module dependencies
*/
/**
* Jobmanager hook
*
* @description :: A hook to compile assets using Webhook.
*/
module.exports = function defineJobmanagerHook (sails) {
// set the default file path if none is enabled
let defaults = { path: ('../../jobs') };
const log = (strings, ...props) => {
let s = '';
for (let i = 0, l = Math.max(strings.length, props.length); i < l; i++) {
s += (strings[i] ? strings[i] : '') + (props[i] ? props[i] : '');
}
sails.log.debug(`[sails-hook-jobmanager] -> ${s}.`);
};
const mpm = d => {
return (d.getHours() * 60) + d.getMinutes();
};
return {
/**
* defaults
*
* The implicit configuration defaults merged into `sails.config` by this hook.
*
* @type {Dictionary}
*/
defaults: function () {
// verify that the hook is enabled else return
if (!(sails && sails.config && sails.config.jobmanager && sails.config.jobmanager.enabled)) {
log`DISABLED -> sails.config.jobmanager.enabled !== true`;
return false;
}
// inform if path is overwritten
if (sails.config.jobmanager.path) {
log`job manager path provided attemting to use ${sails.config.jobmanager.path}`;
} else {
log`no job manager path provided attemting to use default ${defaults.path}`;
}
let validateFalse = '';
try {
// attempt to import the file
let jobs = sails.config.jobmanager.path ? require(sails.config.jobmanager.path) : require(defaults.path);
// validate the properties of each job;
for (let key in jobs) {
let job = jobs[key];
let props = {
interval: 'number',
start: 'object',
run: 'function'
};
for (let prop in props) {
if (typeof job[prop] !== props[prop]) {
validateFalse += `[sails-hook-jobmanager] ${key} -> ${prop} prop should be ${props[prop]}, found ${typeof job[prop]}.\n`;
} else if (prop === 'start' && (job[prop] instanceof Date === false || isNaN(job[prop]))) {
validateFalse += `[sails-hook-jobmanager] ${key} -> ${prop} prop should be a valid date, it did not validate, returned ${new Date(job[prop])}.\n`;
}
}
}
} catch (err) {
throw new Error(
'\n\n[sails-hook-jobmanager] -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n' +
'[sails-hook-jobmanager] Could not import jobs, view error\n' +
'[sails-hook-jobmanager] -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n\n'
);
}
if (validateFalse.length > 0) {
throw new Error(
'\n\n[sails-hook-jobmanager] -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n' +
'[sails-hook-jobmanager] Could not import jobs, config errors:\n' + validateFalse +
'[sails-hook-jobmanager] -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n\n'
);
} else {
log`job configuration sucessfully loaded`;
}
return defaults;
},
/**
* Runs when a Sails app loads/lifts.
*
* @param {Function} done
*/
initialize: function (done) {
// verify that the hook is enabled else return
if (!(sails && sails.config && sails.config.jobmanager && sails.config.jobmanager.enabled)) {
return done();
}
log`initializing`;
sails.after('lifted', function () {
// choose the correct file to use
let jobs = sails.config.jobmanager.path ? require(sails.config.jobmanager.path) : require(defaults.path);
setInterval((d = new Date()) => {
if (sails.config.jobmanager.pulse) {
log`pulse ${d.getHours()}:${('0' + d.getMinutes()).slice(-2)}`;
}
let intervalMPM = mpm(d);
for (let key in jobs) {
let job = jobs[key];
let evaltime = intervalMPM - mpm(job.start);
if ((d >= job.start) && (evaltime % job.interval === 0)) {
job.run();
}
}
}, 60000);
});
// Continue lifting Sails.
return done();
}
};
};