meshblu-rules-engine
Version:
Rules for transforming devices in Meshblu based off of events
64 lines (53 loc) • 2.12 kB
text/coffeescript
_ = require 'lodash'
async = require 'async'
{Engine} = require 'json-rules-engine'
christacheio = require 'christacheio'
RefResolver = require 'meshblu-json-schema-resolver'
moment = require 'moment'
class MeshbluRulesEngine
constructor: ({, , })->
run: ({data={}, metadata={}, device={}, fromDevice={}}, callback) =>
unref = {
data,
metadata,
device,
fromDevice
}
async.parallel {
data: async.apply , data
metadata: async.apply , metadata
device: async.apply , device
fromDevice: async.apply , fromDevice
}, (error, resolved) =>
return callback error if error?
options = _.merge resolved, {unref}
{options, rules: .if}, (error, results) =>
return callback error, results if (error? || !_.isEmpty(results.events))
{options, rules: .else}, callback
return null
_resolve: (obj, callback) =>
return callback null, obj if
resolver = new RefResolver {}
resolver.resolve obj, callback
_runEngine: ({options, rules}, callback) =>
engine = new Engine _.values(rules)
engine
engine
.run options
.then (rawEvents) =>
events = {options, rawEvents}
return callback null, { rawEvents, events }
.catch (error) => callback error
_templateEvents: ({options, rawEvents}) =>
_.map rawEvents, (event) => christacheio event, options, recurseDepth: 5
_addOperators: (engine) =>
engine.addOperator 'exists',
engine.addOperator 'minutesUntil',
_existentialOperator: (factValue, jsonValue) =>
return (factValue != undefined) == jsonValue
_minutesUntilOperator: (factValue, jsonValue) =>
currentTime = moment().utc()
startTime = moment(factValue)
distance = startTime.diff(currentTime, 'minutes')
return (distance <= jsonValue)
module.exports = MeshbluRulesEngine