pico-engine-core
Advanced tools
Comparing version 0.28.0 to 0.29.0
{ | ||
"name": "pico-engine-core", | ||
"version": "0.28.0", | ||
"version": "0.29.0", | ||
"description": "The core javascript api for the pico-engine. (no http, logging, process management etc...)", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
105
src/index.js
@@ -6,2 +6,3 @@ var _ = require("lodash"); | ||
var getArg = require("./getArg"); | ||
var hasArg = require("./hasArg"); | ||
var runKRL = require("./runKRL"); | ||
@@ -17,2 +18,4 @@ var Modules = require("./modules"); | ||
var processQuery = require("./processQuery"); | ||
var processAction = require("./processAction"); | ||
var RulesetRegistry = require("./RulesetRegistry"); | ||
@@ -36,11 +39,6 @@ var log_levels = { | ||
var rulesets = {}; | ||
var salience_graph = {}; | ||
var keys_module_data = {}; | ||
var core = { | ||
db: db, | ||
host: host, | ||
rulesets: rulesets, | ||
salience_graph: salience_graph, | ||
rsreg: RulesetRegistry() | ||
}; | ||
@@ -55,3 +53,3 @@ | ||
return function(id){ | ||
return _.get(keys_module_data, ["used_keys", rid, id]); | ||
return core.rsreg.getKey(rid, id); | ||
}; | ||
@@ -61,12 +59,32 @@ }(ctx.rid));//pass in the rid at mkCTX creation so it is not later mutated | ||
ctx.modules = modules; | ||
var pushCTXScope = function(ctx2){ | ||
return mkCTX(_.assign({}, ctx2, { | ||
rid: ctx.rid,//keep your original rid | ||
scope: ctx.scope.push(), | ||
})); | ||
}; | ||
ctx.KRLClosure = function(fn){ | ||
return function(ctx2, args){ | ||
return fn(mkCTX(_.assign({}, ctx2, { | ||
rid: ctx.rid,//keep your original rid | ||
scope: ctx.scope.push(), | ||
})), function(name, index){ | ||
return fn(pushCTXScope(ctx2), function(name, index){ | ||
return getArg(args, name, index); | ||
}, function(name, index){ | ||
return hasArg(args, name, index); | ||
}); | ||
}; | ||
}; | ||
ctx.defaction = function(ctx, name, fn){ | ||
var actionFn = cocb.wrap(function*(ctx2, args){ | ||
var ctx3 = pushCTXScope(ctx2); | ||
var action_block = yield fn(ctx3, function(name, index){ | ||
return getArg(args, name, index); | ||
}, function(name, index){ | ||
return hasArg(args, name, index); | ||
}); | ||
var r = yield processAction(ctx3, action_block); | ||
return r.returns; | ||
}); | ||
actionFn.is_a_defaction = true; | ||
return ctx.scope.set(name, actionFn); | ||
}; | ||
ctx.emit = function(type, val, message){//for stdlib | ||
@@ -183,8 +201,3 @@ var info = {}; | ||
}; | ||
if(_.has(keys_module_data, ["provided", use.rid, rs.rid])){ | ||
_.set(keys_module_data, [ | ||
"used_keys", | ||
rs.rid, | ||
], keys_module_data.provided[use.rid][rs.rid]); | ||
} | ||
core.rsreg.provideKey(rs.rid, use.rid); | ||
} | ||
@@ -197,37 +210,4 @@ }); | ||
if(true | ||
&& _.has(rs, "meta.keys") | ||
&& _.has(rs, "meta.provides_keys") | ||
){ | ||
_.each(rs.meta.provides_keys, function(p, key){ | ||
_.each(p.to, function(to_rid){ | ||
_.set(keys_module_data, [ | ||
"provided", | ||
rs.rid, | ||
to_rid, | ||
key | ||
], _.cloneDeep(rs.meta.keys[key])); | ||
}); | ||
}); | ||
} | ||
core.rsreg.put(rs); | ||
if(_.has(rs, "meta.keys")){ | ||
//"remove" keys so they don't leak out | ||
//don't use delete b/c it mutates the loaded rs | ||
rs = _.assign({}, rs, { | ||
meta: _.omit(rs.meta, "keys") | ||
}); | ||
} | ||
//now setup `salience_graph` and `rulesets` | ||
_.each(rs.rules, function(rule){ | ||
rule.rid = rs.rid; | ||
_.each(rule.select && rule.select.graph, function(g, domain){ | ||
_.each(g, function(exprs, type){ | ||
_.set(salience_graph, [domain, type, rule.rid, rule.name], true); | ||
}); | ||
}); | ||
}); | ||
rulesets[rs.rid] = rs; | ||
callback(); | ||
@@ -266,5 +246,3 @@ }); | ||
if(err) return callback(err); | ||
initializeAndEngageRuleset(rs, function(rid){ | ||
return rulesets[rid]; | ||
}, function(err){ | ||
initializeAndEngageRuleset(rs, core.rsreg.get, function(err){ | ||
if(err){ | ||
@@ -389,9 +367,3 @@ db.disableRuleset(rs.rid, _.noop);//undo enable if failed | ||
try{ | ||
_.each(rulesets, function(rs){ | ||
_.each(rs.modules_used, function(info){ | ||
if(info.rid === rid){ | ||
throw new Error(err_prefix + "it is depended on by \"" + rs.rid + "\""); | ||
} | ||
}); | ||
}); | ||
core.rsreg.assertNoDependants(rid); | ||
}catch(err){ | ||
@@ -410,12 +382,3 @@ callback(err); | ||
if(_.has(rulesets, rid)){ | ||
_.each(rulesets[rid].rules, function(rule){ | ||
_.each(rule.select && rule.select.graph, function(g, domain){ | ||
_.each(g, function(exprs, type){ | ||
_.unset(salience_graph, [domain, type, rid]); | ||
}); | ||
}); | ||
}); | ||
delete rulesets[rid]; | ||
} | ||
core.rsreg.del(rid); | ||
@@ -422,0 +385,0 @@ callback(); |
@@ -8,2 +8,40 @@ var _ = require("lodash"); | ||
var fns = { | ||
getPicoIDByECI: mkKRLfn([ | ||
"eci", | ||
], function(args, ctx, callback){ | ||
core.db.getPicoIDByECI(args.eci, callback); | ||
}), | ||
listChannels: mkKRLfn([ | ||
"pico_id", | ||
], function(args, ctx, callback){ | ||
core.db.listChannels(args.pico_id, callback); | ||
}), | ||
listAllEnabledRIDs: mkKRLfn([ | ||
], function(args, ctx, callback){ | ||
core.db.listAllEnabledRIDs(callback); | ||
}), | ||
describeRuleset: mkKRLfn([ | ||
"rid", | ||
], function(args, ctx, callback){ | ||
core.db.getEnabledRuleset(args.rid, function(err, data){ | ||
if(err) return callback(err); | ||
var rid = data.rid; | ||
callback(null, { | ||
rid: rid, | ||
src: data.src, | ||
hash: data.hash, | ||
url: data.url, | ||
timestamp_stored: data.timestamp_stored, | ||
timestamp_enable: data.timestamp_enable, | ||
meta: { | ||
name: _.get(core.rsreg.get(rid), ["meta", "name"]), | ||
description: _.get(core.rsreg.get(rid), ["meta", "description"]), | ||
author: _.get(core.rsreg.get(rid), ["meta", "author"]), | ||
}, | ||
}); | ||
}); | ||
}), | ||
}; | ||
var actions = { | ||
newPico: mkKRLfn([ | ||
@@ -25,7 +63,2 @@ ], function(args, ctx, callback){ | ||
}), | ||
listChannels: mkKRLfn([ | ||
"pico_id", | ||
], function(args, ctx, callback){ | ||
core.db.listChannels(args.pico_id, callback); | ||
}), | ||
removeChannel: mkKRLfn([ | ||
@@ -40,7 +73,2 @@ "eci", | ||
}), | ||
getPicoIDByECI: mkKRLfn([ | ||
"eci", | ||
], function(args, ctx, callback){ | ||
core.db.getPicoIDByECI(args.eci, callback); | ||
}), | ||
registerRuleset: mkKRLfn([ | ||
@@ -61,2 +89,11 @@ "url", | ||
}), | ||
unregisterRuleset: mkKRLfn([ | ||
"rid", | ||
], function(args, ctx, callback){ | ||
var rids = _.isArray(args.rid) | ||
? _.uniq(args.rid) | ||
: [args.rid]; | ||
λ.each(rids, core.unregisterRuleset, callback); | ||
}), | ||
installRuleset: mkKRLfn([ | ||
@@ -117,41 +154,8 @@ "pico_id", | ||
}), | ||
unregisterRuleset: mkKRLfn([ | ||
"rid", | ||
], function(args, ctx, callback){ | ||
var rids = _.isArray(args.rid) | ||
? _.uniq(args.rid) | ||
: [args.rid]; | ||
λ.each(rids, core.unregisterRuleset, callback); | ||
}), | ||
listAllEnabledRIDs: mkKRLfn([ | ||
], function(args, ctx, callback){ | ||
core.db.listAllEnabledRIDs(callback); | ||
}), | ||
describeRuleset: mkKRLfn([ | ||
"rid", | ||
], function(args, ctx, callback){ | ||
core.db.getEnabledRuleset(args.rid, function(err, data){ | ||
if(err) return callback(err); | ||
var rid = data.rid; | ||
callback(null, { | ||
rid: rid, | ||
src: data.src, | ||
hash: data.hash, | ||
url: data.url, | ||
timestamp_stored: data.timestamp_stored, | ||
timestamp_enable: data.timestamp_enable, | ||
meta: { | ||
name: _.get(core.rulesets, [rid, "meta", "name"]), | ||
description: _.get(core.rulesets, [rid, "meta", "description"]), | ||
author: _.get(core.rulesets, [rid, "meta", "author"]), | ||
}, | ||
}); | ||
}); | ||
}), | ||
}; | ||
return { | ||
def: fns | ||
def: fns, | ||
actions: actions, | ||
}; | ||
}; |
@@ -17,9 +17,5 @@ var _ = require("lodash"); | ||
var mockEngine = function(core){ | ||
return kengine(core).def; | ||
}; | ||
test("engine:getPicoIDByECI", function(t){ | ||
cocb.run(function*(){ | ||
var engine = mockEngine({ | ||
var engine = kengine({ | ||
db: { | ||
@@ -37,3 +33,3 @@ getPicoIDByECI: tick(function(eci, callback){ | ||
var get = function*(eci){ | ||
return yield engine.getPicoIDByECI({}, {eci: eci,}); | ||
return yield engine.def.getPicoIDByECI({}, {eci: eci,}); | ||
}; | ||
@@ -56,3 +52,3 @@ | ||
cocb.run(function*(){ | ||
var engine = mockEngine({ | ||
var engine = kengine({ | ||
db: { | ||
@@ -74,3 +70,3 @@ getPicoIDByECI: tick(function(eci, callback){ | ||
var rm = function*(eci){ | ||
return yield engine.removeChannel({}, {eci: eci,}); | ||
return yield engine.actions.removeChannel({}, {eci: eci,}); | ||
}; | ||
@@ -92,3 +88,3 @@ | ||
var engine = mockEngine({ | ||
var engine = kengine({ | ||
registerRulesetURL: tick(function(url, callback){ | ||
@@ -101,7 +97,7 @@ callback(null, { | ||
t.equals(yield engine.registerRuleset({}, { | ||
t.equals(yield engine.actions.registerRuleset({}, { | ||
url: "http://foo.bar/qux.krl", | ||
}), "rid for: http://foo.bar/qux.krl"); | ||
t.equals(yield engine.registerRuleset({}, { | ||
t.equals(yield engine.actions.registerRuleset({}, { | ||
url: "qux.krl", | ||
@@ -112,3 +108,3 @@ base: "https://foo.bar/baz/", | ||
try{ | ||
yield engine.registerRuleset({}, []); | ||
yield engine.actions.registerRuleset({}, []); | ||
t.fail("should throw b/c no url is given"); | ||
@@ -124,3 +120,3 @@ }catch(err){ | ||
cocb.run(function*(){ | ||
var engine = mockEngine({ | ||
var engine = kengine({ | ||
installRuleset: tick(function(pico_id, rid, callback){ | ||
@@ -147,3 +143,3 @@ callback(); | ||
var inst = function*(id, rid, url, base){ | ||
return yield engine.installRuleset({}, { | ||
return yield engine.actions.installRuleset({}, { | ||
pico_id: id, | ||
@@ -185,3 +181,3 @@ rid: rid, | ||
var engine = mockEngine({ | ||
var engine = kengine({ | ||
uninstallRuleset: tick(function(id, rid, callback){ | ||
@@ -199,3 +195,3 @@ if(id !== "pico0"){ | ||
t.equals(yield engine.uninstallRuleset({}, { | ||
t.equals(yield engine.actions.uninstallRuleset({}, { | ||
pico_id: "pico0", | ||
@@ -205,3 +201,3 @@ rid: "foo.bar", | ||
t.equals(yield engine.uninstallRuleset({}, { | ||
t.equals(yield engine.actions.uninstallRuleset({}, { | ||
pico_id: "pico0", | ||
@@ -225,3 +221,3 @@ rid: ["baz", "qux"], | ||
var log = []; | ||
var engine = mockEngine({ | ||
var engine = kengine({ | ||
unregisterRuleset: tick(function(rid, callback){ | ||
@@ -236,7 +232,7 @@ if(!_.isString(rid)){ | ||
t.equals(yield engine.unregisterRuleset({}, { | ||
t.equals(yield engine.actions.unregisterRuleset({}, { | ||
rid: "foo.bar", | ||
}), void 0); | ||
t.equals(yield engine.unregisterRuleset({}, { | ||
t.equals(yield engine.actions.unregisterRuleset({}, { | ||
rid: ["baz", "qux"], | ||
@@ -252,3 +248,3 @@ }), void 0); | ||
try{ | ||
yield engine.unregisterRuleset({}, { | ||
yield engine.actions.unregisterRuleset({}, { | ||
rid: ["baz", 2, "qux"], | ||
@@ -255,0 +251,0 @@ }); |
@@ -37,14 +37,2 @@ var _ = require("lodash"); | ||
}), | ||
//TODO this is technically a RuleAction | ||
//TODO should this rather return info for event to be signaled? | ||
//TODO is this allowed other places in the code? | ||
send: mkKRLfn([ | ||
"event", | ||
], function(args, ctx, callback){ | ||
callback(null, { | ||
type: "event:send", | ||
event: args.event | ||
}); | ||
}), | ||
}; | ||
@@ -59,4 +47,14 @@ return { | ||
callback(new Error("Not defined `event:" + id + "`")); | ||
} | ||
}, | ||
actions: { | ||
send: mkKRLfn([ | ||
"event", | ||
], function(args, ctx, callback){ | ||
ctx.addActionResponse(ctx, "event:send", { | ||
event: args.event, | ||
}); | ||
callback(); | ||
}), | ||
}, | ||
}; | ||
}; |
@@ -86,4 +86,5 @@ var _ = require("lodash"); | ||
return { | ||
def: fns | ||
def: fns, | ||
actions: fns, | ||
}; | ||
}; |
@@ -30,3 +30,3 @@ var _ = require("lodash"); | ||
} | ||
var umod = _.get(core.rulesets, [ctx.rid, "modules_used", domain]); | ||
var umod = _.get(core.rsreg.get(ctx.rid), ["modules_used", domain]); | ||
if(_.has(umod, "scope") | ||
@@ -62,5 +62,10 @@ && umod.scope.has(id) | ||
modules[domain].del(ctx, id, callback); | ||
return; | ||
}), | ||
action: cocb.wrap(function*(ctx, domain, id, args){ | ||
if(!_.has(modules, [domain, "actions", id])){ | ||
throw new Error("Not an action `" + domain + ":" + id + "`"); | ||
} | ||
return yield modules[domain].actions[id](ctx, args); | ||
}), | ||
}; | ||
}; |
@@ -18,9 +18,9 @@ var _ = require("lodash"); | ||
"rulesetName": function(core, ctx){ | ||
return _.get(core.rulesets, [ctx.rid, "meta", "name"]); | ||
return _.get(core.rsreg.get(ctx.rid), ["meta", "name"]); | ||
}, | ||
"rulesetDescription": function(core, ctx){ | ||
return _.get(core.rulesets, [ctx.rid, "meta", "description"]); | ||
return _.get(core.rsreg.get(ctx.rid), ["meta", "description"]); | ||
}, | ||
"rulesetAuthor": function(core, ctx){ | ||
return _.get(core.rulesets, [ctx.rid, "meta", "author"]); | ||
return _.get(core.rsreg.get(ctx.rid), ["meta", "author"]); | ||
}, | ||
@@ -27,0 +27,0 @@ "ruleName": function(core, ctx){ |
@@ -1,2 +0,1 @@ | ||
var _ = require("lodash"); | ||
var mkKRLfn = require("../mkKRLfn"); | ||
@@ -7,54 +6,2 @@ | ||
def: { | ||
event: mkKRLfn([ | ||
"at", | ||
"timespec", | ||
"domain", | ||
"type", | ||
"attributes", | ||
], function(args, ctx, callback){ | ||
if(!_.has(ctx, ["event", "eci"])){ | ||
callback(new Error("schedule:event must be executed in response to an event")); | ||
return; | ||
} | ||
var event = { | ||
eci: ctx.event.eci,//in theory we are only running in an event postlude | ||
eid: ctx.event.eid, | ||
domain: args.domain, | ||
type: args.type, | ||
attrs: args.attributes, | ||
}; | ||
if(false | ||
|| args.at !== void 0 && args.timespec !== void 0 | ||
|| args.at === void 0 && args.timespec === void 0 | ||
){ | ||
callback(new Error("schedule:event must use `at` -or- `timespec`")); | ||
return; | ||
} | ||
if(args.at !== void 0){ | ||
var at = new Date(args.at); | ||
if(at.toISOString() !== args.at){ | ||
callback(new Error("schedule:event at must be an ISO date string (i.e. `.toISOString()`)")); | ||
return; | ||
} | ||
core.db.scheduleEventAt(at, event, function(err, val){ | ||
if(err) return callback(err); | ||
core.scheduler.update(); | ||
callback(null, val.id); | ||
}); | ||
return; | ||
} | ||
if(!_.isString(args.timespec)){ | ||
//TODO parse it to ensure it's shaped right | ||
callback(new Error("schedule:event `timespec` must be a cron format string")); | ||
return; | ||
} | ||
core.db.scheduleEventRepeat(args.timespec, event, function(err, val){ | ||
if(err) return callback(err); | ||
core.scheduler.addCron(val.timespec, val.id, val.event); | ||
callback(null, val.id); | ||
}); | ||
}), | ||
list: mkKRLfn([ | ||
@@ -64,2 +11,4 @@ ], function(args, ctx, callback){ | ||
}), | ||
}, | ||
actions: { | ||
remove: mkKRLfn([ | ||
@@ -66,0 +15,0 @@ "id", |
var _ = require("lodash"); | ||
var cocb = require("co-callback"); | ||
var runKRL = require("./runKRL"); | ||
var processAction = require("./processAction"); | ||
var selectRulesToEval = require("./selectRulesToEval"); | ||
var evalRule = cocb.wrap(function*(ctx, rule){ | ||
if(_.isFunction(rule.prelude)){ | ||
yield runKRL(rule.prelude, ctx); | ||
var scheduleEvent = function(core, ctx, args, callback){ | ||
if(!_.has(ctx, ["event", "eci"])){ | ||
callback(new Error("schedule:event must be executed in response to an event")); | ||
return; | ||
} | ||
var did_fire = true; | ||
var event = { | ||
eci: ctx.event.eci,//in theory we are only running in an event postlude | ||
eid: ctx.event.eid, | ||
domain: args.domain, | ||
type: args.type, | ||
attrs: args.attributes, | ||
}; | ||
var condFn = _.get(rule, ["action_block", "condition"]); | ||
var cond = condFn ? yield runKRL(condFn, ctx) : true; | ||
var actions = _.get(rule, ["action_block", "actions"], []); | ||
var block_type = _.get(rule, ["action_block", "block_type"], "every"); | ||
if(block_type === "choose"){ | ||
actions = _.filter(actions, function(action){ | ||
return action.label === cond; | ||
if(false | ||
|| args.at !== void 0 && args.timespec !== void 0 | ||
|| args.at === void 0 && args.timespec === void 0 | ||
){ | ||
callback(new Error("schedule:event must use `at` -or- `timespec`")); | ||
return; | ||
} | ||
if(args.at !== void 0){ | ||
var at = new Date(args.at); | ||
if(at.toISOString() !== args.at){ | ||
callback(new Error("schedule:event at must be an ISO date string (i.e. `.toISOString()`)")); | ||
return; | ||
} | ||
core.db.scheduleEventAt(at, event, function(err, val){ | ||
if(err) return callback(err); | ||
core.scheduler.update(); | ||
callback(null, val.id); | ||
}); | ||
if(_.isEmpty(actions)){ | ||
did_fire = false;//not fired b/c nothing matched | ||
} | ||
}else if(!cond){ | ||
did_fire = false;//not fired b/c falsey cond | ||
return; | ||
} | ||
if(!did_fire){ | ||
actions = [];//don't run anything | ||
if(!_.isString(args.timespec)){ | ||
//TODO parse it to ensure it's shaped right | ||
callback(new Error("schedule:event `timespec` must be a cron format string")); | ||
return; | ||
} | ||
core.db.scheduleEventRepeat(args.timespec, event, function(err, val){ | ||
if(err) return callback(err); | ||
core.scheduler.addCron(val.timespec, val.id, val.event); | ||
callback(null, val.id); | ||
}); | ||
}; | ||
//TODO handle more than one response type | ||
var mapResp = function(response){ | ||
if((response === void 0) || (response === null)){ | ||
return;//noop | ||
} | ||
if(response.type !== "directive"){ | ||
return response; | ||
} | ||
var toResponse = function(ctx, type, val){ | ||
if(type === "directive"){ | ||
return { | ||
type: "directive", | ||
options: response.options, | ||
name: response.name, | ||
options: val.options, | ||
name: val.name, | ||
meta: { | ||
rid: rule.rid, | ||
rule_name: rule.name, | ||
rid: ctx.rid, | ||
rule_name: ctx.rule_name, | ||
txn_id: "TODO",//TODO transactions | ||
@@ -50,13 +65,21 @@ eid: ctx.event.eid | ||
}; | ||
}; | ||
var responses = []; | ||
var i; | ||
for(i = 0; i < actions.length; i++){ | ||
//TODO collect errors and respond individually to the client | ||
//TODO try{}catch(e){} | ||
responses.push(mapResp(yield runKRL(actions[i].action, ctx))); | ||
} | ||
responses = _.compact(responses); | ||
if(type === "event:send"){ | ||
return { | ||
type: "event:send", | ||
event: val.event, | ||
}; | ||
} | ||
throw new Error("Unsupported action response type: " + type); | ||
}; | ||
if(did_fire){ | ||
var evalRule = cocb.wrap(function*(ctx, rule){ | ||
if(_.isFunction(rule.prelude)){ | ||
yield runKRL(rule.prelude, ctx); | ||
} | ||
var action_r = yield processAction(ctx, rule.action_block); | ||
if(action_r.did_fire){ | ||
ctx.emit("debug", "fired"); | ||
@@ -75,4 +98,2 @@ if(_.get(rule, ["postlude", "fired"])){ | ||
} | ||
return responses; | ||
}); | ||
@@ -96,2 +117,4 @@ | ||
raiseError: ctx.raiseError, | ||
scheduleEvent: ctx.scheduleEvent, | ||
addActionResponse: ctx.addActionResponse, | ||
stopRulesetExecution: ctx.stopRulesetExecution, | ||
@@ -144,9 +167,7 @@ }); | ||
var responses = []; | ||
ctx = core.mkCTX({ | ||
event: ctx.event, | ||
pico_id: ctx.pico_id, | ||
stopRulesetExecution: function(){ | ||
ctx.emit("debug", "`last` control statement is stopping ruleset execution"); | ||
schedule = []; | ||
}, | ||
raiseEvent: cocb.toYieldable(function(revent, callback){ | ||
@@ -169,2 +190,4 @@ //shape the revent like a normal event | ||
raiseError: ctx.raiseError, | ||
scheduleEvent: ctx.scheduleEvent, | ||
addActionResponse: ctx.addActionResponse, | ||
stopRulesetExecution: ctx.stopRulesetExecution, | ||
@@ -194,3 +217,22 @@ }); | ||
}); | ||
} | ||
}, | ||
scheduleEvent: cocb.toYieldable(function(sevent, callback){ | ||
scheduleEvent(core, ctx, { | ||
domain: sevent.domain, | ||
type: sevent.type, | ||
attributes: sevent.attributes, | ||
at: sevent.at, | ||
timespec: sevent.timespec, | ||
}, callback); | ||
}), | ||
addActionResponse: function(ctx, type, val){ | ||
var resp = toResponse(ctx, type, val); | ||
responses.push(resp); | ||
return resp; | ||
}, | ||
stopRulesetExecution: function(){ | ||
ctx.emit("debug", "`last` control statement is stopping ruleset execution"); | ||
schedule = []; | ||
}, | ||
}); | ||
@@ -200,16 +242,8 @@ | ||
var responses = []; | ||
//using a while loop b/c schedule is MUTABLE | ||
//Durring execution new events may be `raised` that will mutate the schedule | ||
while(schedule.length > 0){ | ||
responses.push(yield runEvent(schedule.shift())); | ||
yield runEvent(schedule.shift()); | ||
} | ||
responses = _.flattenDeep(_.values(responses)); | ||
//TODO remove this hack when compiler is selective about which actions return values | ||
responses = _.filter(responses, function(resp){ | ||
return _.has(resp, "type"); | ||
}); | ||
var res_by_type = _.groupBy(responses, "type"); | ||
@@ -216,0 +250,0 @@ |
@@ -14,6 +14,6 @@ var _ = require("lodash"); | ||
} | ||
if(!_.has(core.rulesets, ctx.query.rid)){ | ||
var rs = core.rsreg.get(ctx.query.rid); | ||
if(!rs){ | ||
throw new Error("Not found: rid"); | ||
} | ||
var rs = core.rulesets[ctx.query.rid]; | ||
var shares = _.get(rs, ["meta", "shares"]); | ||
@@ -20,0 +20,0 @@ if(!_.isArray(shares) || !_.includes(shares, ctx.query.name)){ |
@@ -14,2 +14,3 @@ var _ = require("lodash"); | ||
"callKRLstdlib", | ||
"defaction", | ||
]; | ||
@@ -59,2 +60,4 @@ | ||
"raiseError", | ||
"scheduleEvent", | ||
"addActionResponse", | ||
"stopRulesetExecution", | ||
@@ -61,0 +64,0 @@ ]); |
@@ -89,25 +89,12 @@ var _ = require("lodash"); | ||
var to_run = _.get(core.salience_graph, [ctx.event.domain, ctx.event.type], {}); | ||
var rules_to_select = []; | ||
_.each(to_run, function(rules, rid){ | ||
var rules_to_select = core.rsreg.salientRules(ctx.event.domain, ctx.event.type, function(rid){ | ||
if(!_.has(pico.ruleset, rid)){ | ||
return; | ||
return false; | ||
} | ||
if(_.has(ctx.event, "for_rid") && _.isString(ctx.event.for_rid)){ | ||
if(rid !== ctx.event.for_rid){ | ||
return; | ||
return false; | ||
} | ||
} | ||
_.each(rules, function(is_on, rule_name){ | ||
if(is_on){ | ||
var rule = _.get(core.rulesets, [rid, "rules", rule_name]); | ||
if(rule){ | ||
//shallow clone with it's own scope for this run | ||
rules_to_select.push(_.assign({}, rule, { | ||
scope: core.rulesets[rid].scope.push() | ||
})); | ||
} | ||
} | ||
}); | ||
return true; | ||
}); | ||
@@ -114,0 +101,0 @@ |
Sorry, the diff of this file is too big to display
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
194129
38
5231
3