webapi-eca/js-coffee/event-poller.js

139 lines
3.7 KiB
JavaScript

// Generated by CoffeeScript 1.7.1
/*
Dynamic Modules
===============
> Compiles CoffeeScript modules and loads JS modules in a VM, together
> with only a few allowed node.js modules.
*/
(function() {
var db, dynmod, fLoadModule, isRunning, listUserModules, log, logconf, logger, pollLoop;
logger = require('./logging');
db = require('./persistence');
dynmod = require('./dynamic-modules');
if (process.argv.length < 7) {
console.error('Not all arguments have been passed!');
process.exit();
}
logconf = {
mode: process.argv[2],
nolog: process.argv[6]
};
logconf['io-level'] = process.argv[3];
logconf['file-level'] = process.argv[4];
logconf['file-path'] = process.argv[5];
log = logger.getLogger(logconf);
log.info('EP | Event Poller starts up');
db({
logger: log
});
dynmod({
logger: log
});
listUserModules = {};
isRunning = true;
process.on('disconnect', function() {
log.info('EP | Shutting down Event Poller');
isRunning = false;
return process.exit();
});
process.on('message', function(msg) {
if (msg.event === 'new' || msg.event === 'init') {
fLoadModule(msg);
}
if (msg.event === 'del') {
delete listUserModules[msg.user][msg.ruleId];
if (JSON.stringify(listUserModules[msg.user]) === "{}") {
return delete listUserModules[msg.user];
}
}
});
fLoadModule = function(msg) {
var arrName, fAnonymous;
arrName = msg.rule.event.split(' -> ');
fAnonymous = function() {
return db.eventPollers.getModule(arrName[0], function(err, obj) {
if (!obj) {
return log.warn("EP | Strange... no module retrieved: " + arrName[0]);
} else {
return dynmod.compileString(obj.data, msg.user, msg.rule.id, arrName[0], obj.lang, db.eventPollers, function(result) {
if (!result.answ === 200) {
log.error("EP | Compilation of code failed! " + msg.user + ", " + msg.rule.id + ", " + arrName[0]);
}
if (!listUserModules[msg.user]) {
listUserModules[msg.user] = {};
}
listUserModules[msg.user][msg.rule.id] = {
id: msg.rule.event,
pollfunc: arrName[1],
module: result.module
};
return log.info("EP | New event module loaded! " + msg.user + ", " + msg.rule.id + ", " + arrName[0]);
});
}
});
};
if (msg.event === 'new' || !listUserModules[msg.user] || !listUserModules[msg.user][msg.rule.id]) {
return fAnonymous();
}
};
/*
This function will loop infinitely every 10 seconds until isRunning is set to false
@private pollLoop()
*/
pollLoop = function() {
var err, fPoll, fRegisterModuleReference, myRule, oRules, ruleName, userName;
if (isRunning) {
for (userName in listUserModules) {
oRules = listUserModules[userName];
for (ruleName in oRules) {
myRule = oRules[ruleName];
fPoll = myRule.module[myRule.pollfunc];
fRegisterModuleReference = function(ruleId, userId, eventId) {
return function(obj) {
return db.pushEvent({
event: eventId,
eventid: "polled " + eventId + " " + userId + "_" + ((new Date).toISOString()),
payload: obj
});
};
};
try {
fPoll(fRegisterModuleReference(ruleName, userName, myRule.id));
} catch (_error) {
err = _error;
log.info('EP | ERROR encountered during polling!');
log.info(err);
}
}
}
return setTimeout(pollLoop, 10000);
}
};
pollLoop();
}).call(this);