diff --git a/nodes/core/logic/17-split.html b/nodes/core/logic/17-split.html
index 1979bd814..39973eab3 100644
--- a/nodes/core/logic/17-split.html
+++ b/nodes/core/logic/17-split.html
@@ -24,12 +24,10 @@
-
diff --git a/nodes/core/logic/17-split.js b/nodes/core/logic/17-split.js
index f385bf158..9ea657d2e 100644
--- a/nodes/core/logic/17-split.js
+++ b/nodes/core/logic/17-split.js
@@ -18,14 +18,22 @@ module.exports = function(RED) {
"use strict";
function sendArray(node,msg,array) {
- for (var i = 0; i < array.length; i++) {
+ for (var i = 0; i < array.length-1; i++) {
msg.payload = array[i];
- msg.parts.index = i;
- msg.parts.count = array.length;
- //if (i === a.length-1) { msg.complete = true; }
+ msg.parts.index = node.c++;
+ if (node.stream !== true) { msg.parts.count = array.length; }
node.send(RED.util.cloneMessage(msg));
}
+ if (node.stream !== true) {
+ msg.payload = array[i];
+ msg.parts.index = node.c++;
+ msg.parts.count = array.length;
+ node.send(RED.util.cloneMessage(msg));
+ node.c = 0;
+ }
+ else { node.remainder = array[i]; }
}
+
function SplitNode(n) {
RED.nodes.createNode(this,n);
var node = this;
@@ -57,17 +65,16 @@ module.exports = function(RED) {
return;
}
node.c = 0;
- node.buffer = new Buffer([]);
+ node.buffer = new Buffer.from([]);
this.on("input", function(msg) {
if (msg.hasOwnProperty("payload")) {
- var a = msg.payload;
if (msg.hasOwnProperty("parts")) { msg.parts = { parts:msg.parts }; } // push existing parts to a stack
else { msg.parts = {}; }
msg.parts.id = msg._msgid; // use the existing _msgid by default.
if (typeof msg.payload === "string") { // Split String into array
+ msg.payload = (node.remainder || "") + msg.payload;
msg.parts.type = "string";
if (node.spltType === "len") {
- // a = msg.payload.match()
msg.parts.ch = "";
var count = msg.payload.length/node.splt;
if (Math.floor(count) !== count) {
@@ -75,16 +82,27 @@ module.exports = function(RED) {
//TODO stream support
count = Math.ceil(count);
}
- msg.parts.count = count;
+ if (node.stream !== true) {
+ msg.parts.count = count;
+ node.c = 0;
+ }
var pos = 0;
var data = msg.payload;
- for (var i=0; i -1) {
count++;
end = pos+node.splt.length;
- pos = msg.payload.indexOf(node.splt,end);
+ pos = buff.indexOf(node.splt,end);
}
//TODO: stream support
// if (end < msg.payload.length) {
count++;
// }
- msg.parts.count = count;
+ if (node.stream !== true) {
+ msg.parts.count = count;
+ node.c = 0;
+ }
var i = 0, p = 0;
- var data = msg.payload;
- pos = data.indexOf(node.splt);
+ pos = buff.indexOf(node.splt);
while (pos > -1) {
- msg.payload = data.slice(p,pos);
- msg.parts.index = i;
+ msg.payload = buff.slice(p,pos);
+ msg.parts.index = node.c++;
node.send(RED.util.cloneMessage(msg));
i++;
p = pos+node.splt.length;
- pos = data.indexOf(node.splt,p);
+ pos = buff.indexOf(node.splt,p);
}
- // if (p < data.length) {
+ if ((node.stream !== true) && (p < buff.length)) {
// TODO: stream support;
- msg.payload = data.slice(p,data.length);
- msg.parts.index = i;
+ msg.payload = buff.slice(p,buff.length);
+ msg.parts.index = node.c++;
+ msg.parts.count = node.c++;
node.send(RED.util.cloneMessage(msg));
- // }
-
+ }
+ else {
+ node.buffer = buff.slice(p,buff.length);
+ }
}
-
- // var len = /*node.buffer.length + */ msg.payload.length;
- // var buff = Buffer.concat([/*node.buffer,*/ msg.payload], len);
- // var pos = buff.indexOf(node.splt);
- // msg.parts.type = "buffer";
- // msg.parts.ch = node.splt; // pass the split to other end for rejoin
- // while (pos !== -1) {
- // msg.payload = buff.slice(0,pos);
- // msg.parts.index = node.c;
- // node.c += 1;
- // buff = buff.slice(pos + node.splt.length);
- // if (buff.length === 0) {
- // msg.parts.count = node.c;
- // node.c = 0; //reset the count if no remainder.
- // }
- // node.send(RED.util.cloneMessage(msg));
- // pos = buff.indexOf(node.splt);
- // }
- // // save the remainder to use as start of next time round
- // node.buffer = buff;
}
//else { } // otherwise drop the message.
}
diff --git a/test/nodes/core/logic/16-range_spec.js b/test/nodes/core/logic/16-range_spec.js
index eb1ae712e..3ec99d5ac 100644
--- a/test/nodes/core/logic/16-range_spec.js
+++ b/test/nodes/core/logic/16-range_spec.js
@@ -134,7 +134,7 @@ describe('range Node', function() {
var sinon = require('sinon');
sinon.stub(rangeNode1, 'log', function(log) {
- if(log.indexOf("notnumber") > -1) {
+ if (log.indexOf("notnumber") > -1) {
done();
} else {
try {
diff --git a/test/nodes/core/logic/17-split_spec.js b/test/nodes/core/logic/17-split_spec.js
index 9a6b49d43..86c8d9f72 100644
--- a/test/nodes/core/logic/17-split_spec.js
+++ b/test/nodes/core/logic/17-split_spec.js
@@ -58,6 +58,47 @@ describe('SPLIT node', function() {
});
});
+ it('should split an array into multiple messages of a specified size', function(done) {
+ var flow = [{id:"sn1", type:"split", wires:[["sn2"]], arraySplt:3, arraySpltType:"len"},
+ {id:"sn2", type:"helper"}];
+ helper.load(splitNode, flow, function() {
+ var sn1 = helper.getNode("sn1");
+ var sn2 = helper.getNode("sn2");
+ sn2.on("input", function(msg) {
+ msg.should.have.property("parts");
+ msg.parts.should.have.property("count",2);
+ msg.parts.should.have.property("type","array");
+ msg.parts.should.have.property("index");
+ msg.payload.should.be.an.Array;
+ if (msg.parts.index === 0) { msg.payload.length.should.equal(3); }
+ if (msg.parts.index === 1) { msg.payload.length.should.equal(1); done(); }
+ });
+ sn1.receive({payload:[1,2,3,4]});
+ });
+ });
+
+ it('should split an object into pieces', function(done) {
+ var flow = [{id:"sn1", type:"split", wires:[["sn2"]]},
+ {id:"sn2", type:"helper"}];
+ helper.load(splitNode, flow, function() {
+ var sn1 = helper.getNode("sn1");
+ var sn2 = helper.getNode("sn2");
+ var count = 0;
+ sn2.on("input", function(msg) {
+ msg.should.have.property("payload");
+ msg.should.have.property("parts");
+ msg.parts.should.have.property("type","object");
+ msg.parts.should.have.property("key");
+ msg.parts.should.have.property("count");
+ msg.parts.should.have.property("index");
+ if (msg.parts.index === 0) { msg.payload.should.equal(1); }
+ if (msg.parts.index === 1) { msg.payload.should.equal("2"); }
+ if (msg.parts.index === 2) { msg.payload.should.equal(true); done(); }
+ });
+ sn1.receive({payload:{a:1,b:"2",c:true}});
+ });
+ });
+
it('should split a string into new-lines', function(done) {
var flow = [{id:"sn1", type:"split", wires:[["sn2"]]},
{id:"sn2", type:"helper"}];
@@ -69,12 +110,12 @@ describe('SPLIT node', function() {
msg.parts.should.have.property("count",4);
msg.parts.should.have.property("type","string");
msg.parts.should.have.property("index");
- if (msg.parts.index === 0) { msg.payload.should.equal("D"); }
- if (msg.parts.index === 1) { msg.payload.should.equal("a"); }
- if (msg.parts.index === 2) { msg.payload.should.equal("v"); }
- if (msg.parts.index === 3) { msg.payload.should.equal("e"); done(); }
+ if (msg.parts.index === 0) { msg.payload.should.equal("Da"); }
+ if (msg.parts.index === 1) { msg.payload.should.equal("ve"); }
+ if (msg.parts.index === 2) { msg.payload.should.equal(" "); }
+ if (msg.parts.index === 3) { msg.payload.should.equal("CJ"); done(); }
});
- sn1.receive({payload:"D\na\nv\ne"});
+ sn1.receive({payload:"Da\nve\n \nCJ"});
});
});
@@ -98,25 +139,93 @@ describe('SPLIT node', function() {
});
});
- it('should split an object into pieces', function(done) {
- var flow = [{id:"sn1", type:"split", wires:[["sn2"]]},
+ it('should split a string into lengths', function(done) {
+ var flow = [{id:"sn1", type:"split", wires:[["sn2"]], splt:"2", spltType:"len"},
{id:"sn2", type:"helper"}];
helper.load(splitNode, flow, function() {
var sn1 = helper.getNode("sn1");
var sn2 = helper.getNode("sn2");
- var count = 0;
sn2.on("input", function(msg) {
- msg.should.have.property("payload");
msg.should.have.property("parts");
- msg.parts.should.have.property("type","object");
- msg.parts.should.have.property("key");
- msg.parts.should.have.property("count");
+ msg.parts.should.have.property("count",4);
+ msg.parts.should.have.property("ch","");
msg.parts.should.have.property("index");
- if (msg.parts.index === 0) { msg.payload.should.equal(1); }
- if (msg.parts.index === 1) { msg.payload.should.equal("2"); }
- if (msg.parts.index === 2) { msg.payload.should.equal(true); done(); }
+ msg.parts.should.have.property("type","string");
+ if (msg.parts.index === 0) { msg.payload.should.equal("12"); }
+ if (msg.parts.index === 1) { msg.payload.should.equal("34"); }
+ if (msg.parts.index === 2) { msg.payload.should.equal("56"); }
+ if (msg.parts.index === 3) { msg.payload.should.equal("78"); done(); }
});
- sn1.receive({payload:{a:1,b:"2",c:true}});
+ sn1.receive({payload:"12345678"});
+ });
+ });
+
+ it('should split a string on a specified char in stream mode', function(done) {
+ var flow = [{id:"sn1", type:"split", wires:[["sn2"]], splt:"\n", stream:true},
+ {id:"sn2", type:"helper"}];
+ helper.load(splitNode, flow, function() {
+ var sn1 = helper.getNode("sn1");
+ var sn2 = helper.getNode("sn2");
+ sn2.on("input", function(msg) {
+ msg.should.have.property("parts");
+ msg.parts.should.have.property("ch","\n");
+ msg.parts.should.have.property("index");
+ msg.parts.should.have.property("type","string");
+ if (msg.parts.index === 0) { msg.payload.should.equal("1"); }
+ if (msg.parts.index === 1) { msg.payload.should.equal("2"); }
+ if (msg.parts.index === 2) { msg.payload.should.equal("3"); }
+ if (msg.parts.index === 3) { msg.payload.should.equal("4"); }
+ if (msg.parts.index === 4) { msg.payload.should.equal("5"); }
+ if (msg.parts.index === 5) { msg.payload.should.equal("6"); done(); }
+ });
+ sn1.receive({payload:"1\n2\n3\n"});
+ sn1.receive({payload:"4\n5\n6\n"});
+ });
+ });
+
+ it('should split a buffer into lengths', function(done) {
+ var flow = [{id:"sn1", type:"split", wires:[["sn2"]], splt:"2", spltType:"len"},
+ {id:"sn2", type:"helper"}];
+ helper.load(splitNode, flow, function() {
+ var sn1 = helper.getNode("sn1");
+ var sn2 = helper.getNode("sn2");
+ sn2.on("input", function(msg) {
+ //console.log(msg);
+ msg.should.have.property("parts");
+ msg.payload.should.be.a.Buffer;
+ msg.parts.should.have.property("count",4);
+ msg.parts.should.have.property("index");
+ msg.parts.should.have.property("type","buffer");
+ if (msg.parts.index === 0) { msg.payload.toString().should.equal("12"); }
+ if (msg.parts.index === 1) { msg.payload.toString().should.equal("34"); }
+ if (msg.parts.index === 2) { msg.payload.toString().should.equal("56"); }
+ if (msg.parts.index === 3) { msg.payload.toString().should.equal("78"); done(); }
+ });
+ var b = new Buffer.from("12345678");
+ sn1.receive({payload:b});
+ });
+ });
+
+ it('should split a buffer on another buffer (streaming)', function(done) {
+ var flow = [{id:"sn1", type:"split", wires:[["sn2"]], splt:"[52]", spltType:"bin", stream:true},
+ {id:"sn2", type:"helper"}];
+ helper.load(splitNode, flow, function() {
+ var sn1 = helper.getNode("sn1");
+ var sn2 = helper.getNode("sn2");
+ sn2.on("input", function(msg) {
+ //console.log(msg);
+ msg.should.have.property("parts");
+ msg.payload.should.be.a.Buffer;
+ msg.parts.should.have.property("index");
+ msg.parts.should.have.property("type","buffer");
+ if (msg.parts.index === 0) { msg.payload.toString().should.equal("123"); }
+ if (msg.parts.index === 1) { msg.payload.toString().should.equal("123"); }
+ if (msg.parts.index === 2) { msg.payload.toString().should.equal("123"); done(); }
+ });
+ var b1 = new Buffer.from("123412");
+ var b2 = new Buffer.from("341234");
+ sn1.receive({payload:b1});
+ sn1.receive({payload:b2});
});
});