From f52289b2c3ed2ef7f676ed515ee802c9c848f3f1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 9 Jul 2019 11:40:55 +0100 Subject: [PATCH] Add send to input handler signature --- .../@node-red/nodes/core/core/58-debug.js | 2 +- .../@node-red/nodes/core/logic/15-change.js | 4 +-- .../@node-red/runtime/lib/nodes/Node.js | 20 +++++++++---- .../@node-red/runtime/lib/nodes/Node_spec.js | 28 +++++++++++++++++-- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/core/58-debug.js b/packages/node_modules/@node-red/nodes/core/core/58-debug.js index badbad25e..9beff7809 100644 --- a/packages/node_modules/@node-red/nodes/core/core/58-debug.js +++ b/packages/node_modules/@node-red/nodes/core/core/58-debug.js @@ -81,7 +81,7 @@ module.exports = function(RED) { } } - this.on("input", function(msg, done) { + this.on("input", function(msg, send, done) { if (this.complete === "true") { // debug complete msg object if (this.console === "true") { diff --git a/packages/node_modules/@node-red/nodes/core/logic/15-change.js b/packages/node_modules/@node-red/nodes/core/logic/15-change.js index fb25939c0..ae377ed1e 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/15-change.js +++ b/packages/node_modules/@node-red/nodes/core/logic/15-change.js @@ -328,12 +328,12 @@ module.exports = function(RED) { } if (valid) { - this.on('input', function(msg, done) { + this.on('input', function(msg, send, done) { applyRules(msg, 0, (err,msg) => { if (err) { node.error(err,msg); } else if (msg) { - node.send(msg); + send(msg); } done(); }) diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js index f4ecabc86..2f95fa5b4 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js @@ -137,7 +137,11 @@ Node.prototype._emitInput = function(arg) { var node = this; if (node._inputCallback) { try { - node._inputCallback(arg,function(err) { node._complete(arg,err); }); + node._inputCallback( + arg, + function() { node.send.apply(node,arguments) }, + function(err) { node._complete(arg,err); } + ); } catch(err) { node.error(err,arg); } @@ -149,12 +153,16 @@ Node.prototype._emitInput = function(arg) { c++; } try { - node._inputCallbacks[i](arg,function(err) { - c--; - if (c === 0) { - node._complete(arg,err); + node._inputCallbacks[i]( + arg, + function() { node.send.apply(node,arguments) }, + function(err) { + c--; + if (c === 0) { + node._complete(arg,err); + } } - }); + ); } catch(err) { node.error(err,msg); } diff --git a/test/unit/@node-red/runtime/lib/nodes/Node_spec.js b/test/unit/@node-red/runtime/lib/nodes/Node_spec.js index 8267411fb..5ad52211e 100644 --- a/test/unit/@node-red/runtime/lib/nodes/Node_spec.js +++ b/test/unit/@node-red/runtime/lib/nodes/Node_spec.js @@ -176,7 +176,7 @@ describe('Node', function() { }}); var message = {payload:"hello world"}; - n.on('input',function(msg, nodeDone) { + n.on('input',function(msg, nodeSend, nodeDone) { nodeDone(); }); n.receive(message); @@ -186,7 +186,7 @@ describe('Node', function() { sinon.stub(n,"error",function(err,msg) {}); var message = {payload:"hello world"}; - n.on('input',function(msg, nodeDone) { + n.on('input',function(msg, nodeSend, nodeDone) { nodeDone(new Error("test error")); setTimeout(function() { try { @@ -253,6 +253,30 @@ describe('Node', function() { } }); + it('emits a message with callback provided send', function(done) { + var flow = { + getNode: (id) => { return {'n1':n1,'n2':n2}[id]}, + handleComplete: (node,msg) => {} + }; + var n1 = new RedNode({_flow:flow,id:'n1',type:'abc',wires:[['n2']]}); + var n2 = new RedNode({_flow:flow,id:'n2',type:'abc'}); + var message = {payload:"hello world"}; + var messageReceived = false; + n1.on('input',function(msg,nodeSend,nodeDone) { + nodeSend(msg); + nodeDone(); + }); + n2.on('input',function(msg) { + // msg equals message, and is not a new copy + messageReceived = true; + should.deepEqual(msg,message); + should.strictEqual(msg,message); + done(); + }); + n1.receive(message); + messageReceived.should.be.false(); + }); + it('emits multiple messages on a single output', function(done) { var flow = { getNode: (id) => { return {'n1':n1,'n2':n2}[id]},