ruleset bofm.main { meta { use module bofm.random alias bofm use module io.picolabs.subscription alias subscription shares __testing, verse } global { __testing = { "queries": [ { "name": "__testing" } , { "name": "verse" } ] , "events": [ { "domain": "bofm", "type": "test" } , { "domain": "bofm", "type": "start_request", "attrs": [ "minutes" ] } , { "domain": "bofm", "type": "idle_request" } , { "domain": "bofm", "type": "new_consumer", "attrs": [ "did", "host" ] } ] } verse_html = function(v,r) { <<
#{r}
#{v}
>> } verse = function() { verses = bofm:verse().map(verse_html) .values() .join(""); << Random verse
#{verses}
>> } my_routers = function() { subscription:getSubscriptions(["attributes","subscriber_role"],"router") .map(function(v){v.values().head()}) } } rule initialize { select when wrangler ruleset_added where rids >< meta:rid pre { bofmBase = meta:rulesetURI; bofmURL = "bofm.router.krl"; } engine:registerRuleset(bofmURL,bofmBase); fired { raise wrangler event "new_child_request" attributes { "dname": "bofm router", "color": "#87cefa", "rids": "bofm.router;io.picolabs.subscription" }; raise wrangler event "install_rulesets_requested" attributes { "rids": "io.picolabs.subscription" }; } } rule new_router { select when wrangler child_initialized pre { child_eci = event:attr("eci"); } noop(); fired { } finally { raise wrangler event "subscription" attributes { "name" : "to_router", "name_space" : "bofm", "my_role" : "generator", "subscriber_role" :"router", "channel_type" : "subscription", "subscriber_eci" : child_eci } } } rule bofm_idle_request { select when bofm idle_request if ent:schedule_id then schedule:remove(ent:schedule_id); fired { clear ent:schedule_id; clear ent:minutes; } } rule bofm_start_request { select when bofm start_request minutes re#(\d+)# setting(minutes) if minutes.as("Number") >= 1 then noop(); fired { ent:minutes := minutes; raise bofm event "verse_needed"; last; } } rule bofm_start_every_minute { select when bofm start_request fired { ent:minutes := 1; raise bofm event "verse_needed"; } } rule bofm_verse_needed { select when bofm verse_needed pre { v = bofm:verse(); } fired { raise bofm event "schedule_bump"; raise bofm event "verse_to_route" attributes v; } } rule bofm_schedule_bump { select when bofm schedule_bump fired { schedule bofm event "verse_needed" at time:add(time:now(), {"minutes": ent:minutes}) setting(schedule_id); ent:schedule_id := schedule_id; } } rule test { select when bofm test pre { v = bofm:verse(); } send_directive("verse",{"verse":v,"eid":event:eid}); fired { raise bofm event "verse_to_route" attributes v; } } rule bofm_verse_to_route { select when bofm verse_to_route foreach my_routers() setting(s) pre { eci = s{["attributes","outbound_eci"]}; } event:send({"eci":eci, "domain": "bofm", "type": "verse", "attrs": event:attrs}); } rule bofm_new_consumer { select when bofm new_consumer did re#(.+)# setting(consumer_eci) pre { router_eci = my_routers().head(){["attributes","subscriber_eci"]}; } event:send( { "eci": router_eci, "eid": "new-consumer", "domain": "bofm", "type": "new_consumer", "attrs": event:attrs.put("consumer_eci",consumer_eci) } ) } }