Skip to content

Commit

Permalink
Merge pull request #2869 from node-red/Fix-join-node-array-index-and-…
Browse files Browse the repository at this point in the history
…reset

Fix join node array index and reset
  • Loading branch information
knolleary committed Feb 25, 2021
2 parents de24831 + 4cd9b7b commit e6f1394
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 12 deletions.
34 changes: 22 additions & 12 deletions packages/node_modules/@node-red/nodes/core/sequence/17-split.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ module.exports = function(RED) {
}
} else { // otherwise drop the message.
done();
}
}
}
});
}
Expand Down Expand Up @@ -561,7 +561,7 @@ module.exports = function(RED) {
reduceMessage(node, nextMsgInfo, err => {
if (err) {
nextMsgInfo.done(err);//.error(err,nextMsg);
}
}
activeMessage = null;
processReduceMessageQueue();
})
Expand All @@ -570,12 +570,7 @@ module.exports = function(RED) {
this.on("input", function(msg, send, done) {
try {
var property;
if (node.mode === 'auto' && (!msg.hasOwnProperty("parts")||!msg.parts.hasOwnProperty("id"))) {
node.warn("Message missing msg.parts property - cannot join in 'auto' mode")
done();
return;
}

var partId = "_";
if (node.propertyType == "full") {
property = msg;
}
Expand All @@ -589,7 +584,21 @@ module.exports = function(RED) {
}
}

var partId;
if (node.mode === 'auto' && (!msg.hasOwnProperty("parts")||!msg.parts.hasOwnProperty("id"))) {
// if a blank reset messag erest it all.
if (msg.hasOwnProperty("reset")) {
if (inflight && inflight.hasOwnProperty("partId") && inflight[partId].timeout) {
clearTimeout(inflight[partId].timeout);
}
inflight = {};
}
else {
node.warn("Message missing msg.parts property - cannot join in 'auto' mode")
}
done();
return;
}

var payloadType;
var propertyKey;
var targetCount;
Expand All @@ -611,7 +620,6 @@ module.exports = function(RED) {
}
else {
// Use the node configuration to identify all of the group information
partId = "_";
payloadType = node.build;
targetCount = node.count;
joinChar = node.joiner;
Expand All @@ -621,6 +629,9 @@ module.exports = function(RED) {
if (node.build === 'object') {
propertyKey = RED.util.getMessageProperty(msg,node.key);
}
if (msg.hasOwnProperty("parts")) {
propertyIndex = msg.parts.index;
}
}

if (msg.hasOwnProperty("reset")) {
Expand Down Expand Up @@ -725,8 +736,8 @@ module.exports = function(RED) {
}
} else {
if (!isNaN(propertyIndex)) {
if (group.payload[propertyIndex] == undefined) { group.currentCount++; }
group.payload[propertyIndex] = property;
group.currentCount++;
} else {
if (property !== undefined) {
group.payload.push(property);
Expand Down Expand Up @@ -762,4 +773,3 @@ module.exports = function(RED) {
}
RED.nodes.registerType("join",JoinNode);
}

46 changes: 46 additions & 0 deletions test/nodes/core/sequence/17-split_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1646,6 +1646,51 @@ describe('JOIN node', function() {
});
});

it('should handle join an array when using msg.parts and duplicate indexed parts arrive', function (done) {
var flow = [{ id: "n1", type: "join", wires: [["n2"]], joiner: "[44]", joinerType: "bin", build: "array", mode: "auto" },
{ id: "n2", type: "helper" }];
helper.load(joinNode, flow, function () {
var n1 = helper.getNode("n1");
var n2 = helper.getNode("n2");
n2.on("input", function (msg) {
try {
msg.should.have.property("payload");
msg.payload[0].should.equal("C");
msg.payload[1].should.equal("D");
done();
}
catch (e) { done(e); }
});
n1.receive({ payload: "A", parts: { id:1, type:"array", ch:",", index:0, count:2 } });
n1.receive({ payload: "B", parts: { id:1, type:"array", ch:",", index:0, count:2 } });
n1.receive({ payload: "C", parts: { id:1, type:"array", ch:",", index:0, count:2 } });
n1.receive({ payload: "D", parts: { id:1, type:"array", ch:",", index:1, count:2 } });
});
});

it('should handle join an array when using msg.parts and duplicate indexed parts arrive and being reset halfway', function (done) {
var flow = [{ id: "n1", type: "join", wires: [["n2"]], joiner: "[44]", joinerType: "bin", build: "array", mode: "auto" },
{ id: "n2", type: "helper" }];
helper.load(joinNode, flow, function () {
var n1 = helper.getNode("n1");
var n2 = helper.getNode("n2");
n2.on("input", function (msg) {
try {
msg.should.have.property("payload");
msg.payload[0].should.equal("D");
msg.payload[1].should.equal("C");
done();
}
catch (e) { done(e); }
});
n1.receive({ payload: "A", parts: { id:1, type:"array", ch:",", index:0, count:2 } });
n1.receive({ payload: "B", parts: { id:1, type:"array", ch:",", index:0, count:2 } });
n1.receive({ reset:true });
n1.receive({ payload: "C", parts: { id:1, type:"array", ch:",", index:1, count:2 } });
n1.receive({ payload: "D", parts: { id:1, type:"array", ch:",", index:0, count:2 } });
});
});

describe('messaging API', function() {
function mapiDoneSplitTestHelper(done, splt, spltType, stream, msgAndTimings) {
const completeNode = require("nr-test-utils").require("@node-red/nodes/core/common/24-complete.js");
Expand Down Expand Up @@ -1821,4 +1866,5 @@ describe('JOIN node', function() {
});

})

});

0 comments on commit e6f1394

Please sign in to comment.