From 8c19daf949dc59574ebfa99e27238a884c485d14 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 25 Feb 2022 15:56:13 +0000 Subject: [PATCH 1/3] TCP nodes- Add optional reattach delimiter to streaming strings --- .../@node-red/nodes/core/network/31-tcpin.html | 8 ++++++-- .../@node-red/nodes/core/network/31-tcpin.js | 11 ++++++++--- .../@node-red/nodes/locales/en-US/messages.json | 3 ++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html index 97c8eb4d7..01b4c606a 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html @@ -50,7 +50,8 @@
@@ -76,6 +77,7 @@ datatype:{value:"buffer"}, newline:{value:""}, topic: {value:""}, + trim: {value:false}, base64: {/*deprecated*/ value:false, required:true}, tls: {type:"tls-config", value:'', required:false} }, @@ -286,7 +288,8 @@
@@ -306,6 +309,7 @@ ret: {value:"buffer"}, splitc: {value:"0", required:true}, newline: {value:""}, + trim: {value:false}, tls: {type:"tls-config", value:'', required:false} }, inputs:1, diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js index 24e6abf7e..99603abb4 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js @@ -88,6 +88,7 @@ module.exports = function(RED) { this.datatype = n.datatype||'buffer'; /* buffer,utf8,base64 */ this.newline = (n.newline||"").replace("\\n","\n").replace("\\r","\r").replace("\\t","\t"); this.base64 = n.base64; + this.trim = n.trim || false; this.server = (typeof n.server == 'boolean')?n.server:(n.server == "server"); this.closing = false; this.connected = false; @@ -135,7 +136,8 @@ module.exports = function(RED) { buffer = buffer+data; var parts = buffer.split(node.newline); for (var i = 0; i Date: Fri, 25 Feb 2022 16:19:20 +0000 Subject: [PATCH 2/3] Add tests --- test/nodes/core/network/31-tcpin_spec.js | 13 +++++++++++++ test/nodes/core/network/31-tcprequest_spec.js | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/test/nodes/core/network/31-tcpin_spec.js b/test/nodes/core/network/31-tcpin_spec.js index cbe7ced2a..a694991ff 100644 --- a/test/nodes/core/network/31-tcpin_spec.js +++ b/test/nodes/core/network/31-tcpin_spec.js @@ -121,6 +121,19 @@ describe('TCP in Node', function() { testTCP0(flow, ["foo\nbar"], ["foo", "bar"], done); }); + it('should recv data (Stream/String/Delimiter:o\\n)', function(done) { + var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"o\n", topic:"", base64:false, wires:[["n2"]] }, + {id:"n2", type:"helper"}]; + testTCP0(flow, ["foo\nbar"], ["fo", "bar"], done); + }); + + it('should recv data (Stream/String/Delimiter:o\\n) and reattach o', function(done) { + var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"o\n", trim:true, topic:"", base64:false, wires:[["n2"]] }, + {id:"n2", type:"helper"}]; + testTCP0(flow, ["foo\nbar"], ["foo", "bar"], done); + }); + + it('should recv data (Stream/String/No delimiter)', function(done) { var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"", topic:"", base64:false, wires:[["n2"]] }, {id:"n2", type:"helper"}]; diff --git a/test/nodes/core/network/31-tcprequest_spec.js b/test/nodes/core/network/31-tcprequest_spec.js index dce73d858..e61e4f7d7 100644 --- a/test/nodes/core/network/31-tcprequest_spec.js +++ b/test/nodes/core/network/31-tcprequest_spec.js @@ -277,6 +277,21 @@ describe('TCP Request Node', function() { }, { payload: "bar\nfoo", topic: 'boo' + }], { + payload: "ACK:foobar", + topic: 'boo' + }, done); + }); + + it('should send & receive, then keep connection, and split return strings and reattach delimiter', function(done) { + var flow = [{id:"n1", type:"tcp request", server:"localhost", port:port, out:"sit", ret:"string", newline:"\\n", trim:true, wires:[["n2"]] }, + {id:"n2", type:"helper"}]; + testTCPMany(flow, [{ + payload: "foo", + topic: 'boo' + }, { + payload: "bar\nfoo", + topic: 'boo' }], { payload: "ACK:foobar", topic: 'boo' From 8a4062281504e769e8348c793b6bcf460eacca28 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 23 Mar 2022 22:07:43 +0000 Subject: [PATCH 3/3] tcp node - undo trim if we re-add split chars and fix tests --- .../node_modules/@node-red/nodes/core/network/31-tcpin.js | 6 +++--- .../@node-red/nodes/locales/en-US/messages.json | 2 +- test/nodes/core/network/31-tcpin_spec.js | 2 +- test/nodes/core/network/31-tcprequest_spec.js | 2 +- test/nodes/core/parsers/70-JSON_spec.js | 4 ++-- test/nodes/core/parsers/70-XML_spec.js | 6 +++--- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js index 99603abb4..531b3ac2d 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js @@ -137,7 +137,7 @@ module.exports = function(RED) { var parts = buffer.split(node.newline); for (var i = 0; i\nfoo", topic: 'boo' }], { - payload: "ACK:foobar", + payload: "ACK:foobar\n", topic: 'boo' }, done); }); diff --git a/test/nodes/core/parsers/70-JSON_spec.js b/test/nodes/core/parsers/70-JSON_spec.js index 32c5062e8..c3a2216e0 100644 --- a/test/nodes/core/parsers/70-JSON_spec.js +++ b/test/nodes/core/parsers/70-JSON_spec.js @@ -45,7 +45,7 @@ describe('JSON node', function() { msg.payload.employees[0].should.have.property('lastName', 'Smith'); done(); }); - var jsonString = '{"employees":[{"firstName":"John", "lastName":"Smith"}]}'; + var jsonString = ' {"employees":[{"firstName":"John", "lastName":"Smith"}]}\r\n '; jn1.receive({payload:jsonString,topic: "bar"}); }); }); @@ -63,7 +63,7 @@ describe('JSON node', function() { msg.payload.employees[0].should.have.property('lastName', 'Smith'); done(); }); - var jsonString = Buffer.from('{"employees":[{"firstName":"John", "lastName":"Smith"}]}'); + var jsonString = Buffer.from(' {"employees":[{"firstName":"John", "lastName":"Smith"}]}\r\n '); jn1.receive({payload:jsonString,topic: "bar"}); }); }); diff --git a/test/nodes/core/parsers/70-XML_spec.js b/test/nodes/core/parsers/70-XML_spec.js index e8b281855..c5e13f952 100644 --- a/test/nodes/core/parsers/70-XML_spec.js +++ b/test/nodes/core/parsers/70-XML_spec.js @@ -56,7 +56,7 @@ describe('XML node', function() { should.equal(msg.payload.employees.lastName[0], 'Smith'); done(); }); - var string = 'JohnSmith'; + var string = ' JohnSmith\r\n '; n1.receive({payload:string,topic: "bar"}); }); }); @@ -76,7 +76,7 @@ describe('XML node', function() { should.equal(msg.foo.employees.lastName[0], 'Smith'); done(); }); - var string = 'JohnSmith'; + var string = ' JohnSmith\r\n '; n1.receive({foo:string,topic: "bar"}); }); }); @@ -96,7 +96,7 @@ describe('XML node', function() { should.equal(msg.payload.employees.lastName[0], 'Smith'); done(); }); - var string = 'JohnSmith'; + var string = ' JohnSmith\r\n '; n1.receive({payload:string, topic:"bar", options:{trim:true}}); }); });