-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathengine.js
More file actions
87 lines (58 loc) · 2.01 KB
/
Copy pathengine.js
File metadata and controls
87 lines (58 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// http://www.bizrez.com
// (c) 2004-2014 David Mallon
// Freely distributed under the MIT license.
/*global module: false, onevar: false, console: false */
var async = require("async");
// Main: engine.execute Stateless
(function () {
"use strict";
var STATUS_CONDITION_MET = "Condition-Met";
var STATUS_CONDITION_NOT_MET = "Condition-Not-Met";
var CONCURENCY = 2;
var engine = {};
var rules = [];
var rulesIndex = [];
engine.loadRules = function (rulesToLoad) {
rules = rulesToLoad.rules;
// Create index by rule-id for lookup
for (var i = 0; i < rules.length; i++) {
rulesIndex.push(rules[i].id);
}
};
// Run list of rules placed in the queue
engine.queue = async.queue(function (list, callback) {
var err = null;
engine.execute(err, list.facts, list.ruleId, function () {
// Rule run on Facts completed. Do we want to run a callback from the list?
if (typeof list.callback === "function") {
list.callback();
}
});
// See rulesEngine.queue.push(list, fn(err)) fn=callback
callback(err);
}, CONCURENCY);
// Main - Run Single Rule
engine.execute = function (err, facts, ruleId, callback) {
var ruleIndex;
// Process The Rule by ruleId
try {
// Look up rule
ruleIndex = rulesIndex.indexOf(ruleId);
// When the Condition is 'met' then do the 'action'
if (rules[ruleIndex].condition(facts)) {
rules[ruleIndex].action(facts);
facts.output.status = STATUS_CONDITION_MET;
} else {
facts.output.status = STATUS_CONDITION_NOT_MET;
}
} catch (e) {
err = new Error("Error on engine.js");
err.original= e;
return;
}
if (typeof callback === "function") {
callback();
}
};
module.exports = engine;
})();