webapi-eca/js-coffee/engine.js
2014-04-03 17:41:51 +02:00

183 lines
4.6 KiB
JavaScript

// Generated by CoffeeScript 1.6.3
/*
Engine
==================
> The heart of the WebAPI ECA System. The engine loads action invoker modules
> corresponding to active rules actions and invokes them if an appropriate event
> is retrieved.
*/
(function() {
var db, dynmod, exports, isRunning, listUserRules, pollQueue, processEvent, updateActionModules, validConditions,
_this = this,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
db = require('./persistence');
dynmod = require('./dynamic-modules');
listUserRules = {};
isRunning = false;
/*
Module call
-----------
Initializes the Engine and starts polling the event queue for new events.
@param {Object} args
*/
exports = module.exports = function(args) {
if (!isRunning) {
isRunning = true;
_this.log = args.logger;
db(args);
dynmod(args);
pollQueue();
return module.exports;
}
};
/*
Add an event handler (eh) that listens for rules.
@public addRuleListener ( *eh* )
@param {function} eh
*/
exports.internalEvent = function(evt) {
var oRule, oUser;
if (!listUserRules[evt.user]) {
listUserRules[evt.user] = {
rules: {},
actions: {}
};
}
oUser = listUserRules[evt.user];
oRule = evt.rule;
if (evt.event === 'new' || (evt.event === 'init' && !oUser.rules[oRule.id])) {
oUser.rules[oRule.id] = oRule;
return updateActionModules(oRule);
}
};
updateActionModules = function(oNewRule) {
var fAddRequired, fRemoveNotRequired, name, oUser, userName, _results;
fRemoveNotRequired = function(oUser) {
var action, fRequired, _results;
fRequired = function(actionName) {
var nmRl, oRl, _ref;
_ref = oUser.rules;
for (nmRl in _ref) {
oRl = _ref[nmRl];
if (__indexOf.call(oRl.actions, actionName) >= 0) {
return true;
}
}
return false;
};
_results = [];
for (action in oUser.actions) {
if (!fRequired(action)) {
_results.push(delete oUser.actions[action]);
}
}
return _results;
};
for (name in listUserRules) {
oUser = listUserRules[name];
fRemoveNotRequired(oUser);
}
fAddRequired = function(userName, oUser) {
var fCheckRules, nmRl, oRl, _ref, _results;
fCheckRules = function(oRule) {
var action, fAddIfNewOrNotExisting, _i, _len, _ref, _results;
fAddIfNewOrNotExisting = function(actionName) {
var moduleName;
moduleName = (actionName.split(' -> '))[0];
if (!oUser.actions[moduleName] || oRule.id === oNewRule.id) {
return db.actionInvokers.getModule(moduleName, function(err, obj) {
var params, res;
params = {};
res = dynmod.compileString(obj.data, userName, moduleName, params, obj.lang);
return oUser.actions[moduleName] = res.module;
});
}
};
_ref = oRule.actions;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
action = _ref[_i];
_results.push(fAddIfNewOrNotExisting(action));
}
return _results;
};
_ref = oUser.rules;
_results = [];
for (nmRl in _ref) {
oRl = _ref[nmRl];
_results.push(fCheckRules(oRl));
}
return _results;
};
_results = [];
for (userName in listUserRules) {
oUser = listUserRules[userName];
_results.push(fAddRequired(userName, oUser));
}
return _results;
};
pollQueue = function() {
if (isRunning) {
return db.popEvent(function(err, obj) {
if (!err && obj) {
processEvent(obj);
}
return setTimeout(pollQueue, 50);
});
}
};
/*
Checks whether all conditions of the rule are met by the event.
@private validConditions ( *evt, rule* )
@param {Object} evt
@param {Object} rule
*/
validConditions = function(evt, rule) {
var conds, prop;
conds = rule.conditions;
for (prop in conds) {
if (!evt[prop] || evt[prop] !== conds[prop]) {
return false;
}
}
return true;
};
/*
Handles retrieved events.
@private processEvent ( *evt* )
@param {Object} evt
*/
processEvent = function(evt) {
return this.log.info('EN | processing event: ' + evt.event + '(' + evt.eventid + ')');
};
exports.shutDown = function() {
return isRunning = false;
};
}).call(this);