New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

pico-engine-core

Package Overview
Dependencies
Maintainers
2
Versions
145
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

pico-engine-core - npm Package Compare versions

Comparing version 0.28.0 to 0.29.0

src/hasArg.js

2

package.json
{
"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",

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc