mirror of
https://github.com/Hopiu/webapi-eca.git
synced 2026-04-09 17:31:05 +00:00
183 lines
4.6 KiB
JavaScript
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);
|