diff --git a/component.json b/component.json index 21489e7..63685f3 100644 --- a/component.json +++ b/component.json @@ -22,6 +22,7 @@ "components/FilterByGroup.coffee", "components/Objectify.coffee", "components/ReadGroup.coffee", + "components/SendByGroup.coffee", "components/CollectGroups.coffee", "components/FirstGroup.coffee", "components/MapGroup.coffee", @@ -42,6 +43,7 @@ "FilterByGroup": "components/FilterByGroup.coffee", "Objectify": "components/Objectify.coffee", "ReadGroup": "components/ReadGroup.coffee", + "SendByGroup": "components/SendByGroup.coffee", "CollectGroups": "components/CollectGroups.coffee", "FirstGroup": "components/FirstGroup.coffee", "MapGroup": "components/MapGroup.coffee", diff --git a/components/SendByGroup.coffee b/components/SendByGroup.coffee new file mode 100644 index 0000000..2d0162e --- /dev/null +++ b/components/SendByGroup.coffee @@ -0,0 +1,54 @@ +noflo = require 'noflo' + +class SendByGroup extends noflo.Component + description: 'Send packet held in "data" when receiving + matching set of groups in "in"' + icon: 'share-sign' + + constructor: -> + @data = {} + @ungrouped = null + @dataGroups = [] + @inGroups = [] + + @inPorts = + in: new noflo.Port 'bang' + data: new noflo.Port 'all' + + @outPorts = + out: new noflo.ArrayPort 'all' + + @inPorts.data.on 'begingroup', (group) => + @dataGroups.push group + @inPorts.data.on 'data', (data) => + unless @dataGroups.length + @ungrouped = data + return + @data[@groupId(@dataGroups)] = data + @inPorts.data.on 'endgroup', => + @dataGroups.pop() + + @inPorts.in.on 'begingroup', (group) => + @inGroups.push group + @inPorts.in.on 'data', (data) => + unless @dataGroups.length + @send @ungrouped if @ungrouped isnt null + return + id = @groupId @inGroups + unless @data[@groupId] + return + @send @data[id] + @inPorts.in.on 'endgroup', => + @inGroups.pop() + @inPorts.in.on 'disconnect', => + @outPorts.out.disconnect() + + groupId: (groups) -> + groups.join ':' + + send: (data) -> + for group in @inGroups + @outPorts.out.beginGroup group + @outPorts.out.send data + for group in @inGroups + @outPorts.out.endGroup() diff --git a/package.json b/package.json index d1002e6..8bb5166 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "FilterByGroup": "./components/FilterByGroup.coffee", "Objectify": "./components/Objectify.coffee", "ReadGroup": "./components/ReadGroup.coffee", + "SendByGroup": "components/SendByGroup.coffee", "CollectGroups": "./components/CollectGroups.coffee", "FirstGroup": "./components/FirstGroup.coffee", "MapGroup": "./components/MapGroup.coffee",