decision
Version:
Decision System Based on Event System and Alleyway Grammer
138 lines (124 loc) • 4.17 kB
JavaScript
;
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"];