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}); }); });