UNPKG

decision

Version:

Decision System Based on Event System and Alleyway Grammer

138 lines (124 loc) 4.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var makeDecisions = function makeDecisions(decisions, marmoset, alleyway) { for (var i = 0; i < decisions.length; i++) { var decision = decisions[i]; makeDecision(decision, marmoset, alleyway); } }; var makeDecision = function makeDecision(decision, marmoset, alleyway) { decision.end(function (queueInfo) { var _fetchData = fetchData(queueInfo); var when = _fetchData.when; var actionType = _fetchData.actionType; var dataRule = _fetchData.dataRule; var name = _fetchData.name; var filter = _fetchData.filter; createDecisionEndEvent(marmoset, name); listen(when, marmoset, function (e) { if (filter) { var filterResult = getAction(alleyway, filter).call(undefined, e.data); if (!filterResult) return; } var actionResult = getAction(alleyway, actionType).apply(undefined, getActionData(e.data, dataRule)); waitResult(actionResult, function (res) { // TODO trigger decision end event marmoset.trigger("system", "decisionEnd", { name: name, res: res, when: when, actionType: actionType }); }, function (err) { throw new Error(err); }); }); }); }; var waitResult = function waitResult(actionResult, cb, fail) { if (actionResult && typeof actionResult.then === "function") { actionResult.then(function (res) { cb && cb(res); })["catch"](function (err) { return fail(err); }); } else { cb && cb(actionResult); } }; var getAction = function getAction(alleyway, actionType) { if (typeof actionType === "function") { var action = actionType; } else if (typeof actionType === "string") { var action = alleyway.translate(actionType); } return action; }; var getActionData = function getActionData(data, dataRule) { if (dataRule) { data = dataRule(data); if (!isArray(data)) { data = [data]; } } else { data = [data]; } return data; }; var createDecisionEndEvent = function createDecisionEndEvent(marmoset, name) { if (!name) return; marmoset.createEventByRoute(function (m) { m().happen("system", "decisionEnd").inCase(function (e) { return e.data.name === name; }).trigger("system", name).data(function (e) { return e.data.res; }); }); }; var fetchData = function fetchData(queueInfo) { var map = queueInfo.getMap(); var when = map["when"].args[0]; var actionType = map["then"].args[0]; var dataRule = map["data"] && map["data"].args[0]; var name = map["named"] && map["named"].args[0]; var filter = map["filter"] && map["filter"].args[0]; return { when: when, actionType: actionType, dataRule: dataRule, name: name, filter: filter }; }; var isArray = function isArray(v) { return v && typeof v === "object" && typeof v.length === "number"; }; var listen = function listen(when, marmoset, callback) { var res = splitWhen(when); if (res.ctxs.length === 1) { marmoset.on(res.ctxs[0], res.types.join(";"), function (e) { callback && callback(e); }); } else if (res.ctxs.length > 1) { marmoset.onGroup(res.ctxs, res.types.join(";"), function (e) { callback && callback(e); }); } }; var splitWhen = function splitWhen(when) { var sentences = when.split(";"); var ctxs = [], types = []; for (var i = 0; i < sentences.length; i++) { var sentence = sentences[i]; var parts = sentence.split("::"); var channel = parts[0]; var eventType = parts[1]; ctxs.push(channel); types.push(eventType); } return { ctxs: ctxs, types: types }; }; exports["default"] = makeDecisions; module.exports = exports["default"];