From f5bebef37f8fb4f487d4383e2cd66c510b44986c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 23 Sep 2018 10:34:22 +0100 Subject: [PATCH 1/7] websocket - preserve _session on msg but don't send as part of wholemsg --- .../node_modules/@node-red/nodes/core/io/22-websocket.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js index c2fab34e3..55964062d 100644 --- a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js @@ -250,9 +250,12 @@ module.exports = function(RED) { this.on("input", function(msg) { var payload; if (this.serverConfig.wholemsg) { + var sess = ""+msg._session; delete msg._session; payload = JSON.stringify(msg); - } else if (msg.hasOwnProperty("payload")) { + msg._session = sess; + } + else if (msg.hasOwnProperty("payload")) { if (!Buffer.isBuffer(msg.payload)) { // if it's not a buffer make sure it's a string. payload = RED.util.ensureString(msg.payload); } From f0957c838ff0d965cb0eae47db7df9522f70ec5f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 23 Sep 2018 10:35:18 +0100 Subject: [PATCH 2/7] add watched filename to msg.filename so can feed direct to file in node --- .../@node-red/nodes/core/io/23-watch.html | 2 +- .../@node-red/nodes/core/io/23-watch.js | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/23-watch.html b/packages/node_modules/@node-red/nodes/core/io/23-watch.html index a0259becd..c66159c7b 100644 --- a/packages/node_modules/@node-red/nodes/core/io/23-watch.html +++ b/packages/node_modules/@node-red/nodes/core/io/23-watch.html @@ -36,7 +36,7 @@

You can enter a list of comma separated directories and/or files. You will need to put quotes "..." around any that have spaces in.

On Windows you must use double back-slashes \\ in any directory names.

-

The full filename of the file that actually changed is put into msg.payload, +

The full filename of the file that actually changed is put into msg.payload and msg.filename, while a stringified version of the watch list is returned in msg.topic.

msg.file contains just the short filename of the file that changed. msg.type has the type of thing changed, usually file or directory, diff --git a/packages/node_modules/@node-red/nodes/core/io/23-watch.js b/packages/node_modules/@node-red/nodes/core/io/23-watch.js index b6adbc392..e43317bb4 100644 --- a/packages/node_modules/@node-red/nodes/core/io/23-watch.js +++ b/packages/node_modules/@node-red/nodes/core/io/23-watch.js @@ -18,7 +18,6 @@ module.exports = function(RED) { "use strict"; var Notify = require("fs.notify"); var fs = require("fs"); - var sep = require("path").sep; var path = require("path"); var getAllDirs = function (dir, filelist) { @@ -52,14 +51,14 @@ module.exports = function(RED) { } var notifications = new Notify(node.files); - notifications.on('change', function (file, event, path) { + notifications.on('change', function (file, event, fpath) { var stat; try { - if (fs.statSync(path).isDirectory()) { path = path + sep + file; } - stat = fs.statSync(path); + if (fs.statSync(fpath).isDirectory()) { fpath = path.join(fpath,file); } + stat = fs.statSync(fpath); } catch(e) { } var type = "none"; - var msg = { payload:path, topic:node.p, file:file }; + var msg = { payload:fpath, topic:node.p, file:file, filename:fpath }; if (stat) { if (stat.isFile()) { type = "file"; msg.size = stat.size; } else if (stat.isBlockDevice()) { type = "blockdevice"; } @@ -69,8 +68,8 @@ module.exports = function(RED) { else if (stat.isDirectory()) { type = "directory"; if (node.recursive) { - notifications.add([path]); - notifications.add(getAllDirs(path)); + notifications.add([fpath]); + notifications.add(getAllDirs(fpath)); } } else { type = "n/a"; } @@ -79,8 +78,8 @@ module.exports = function(RED) { node.send(msg); }); - notifications.on('error', function (error, path) { - var msg = { payload:path }; + notifications.on('error', function (error, fpath) { + var msg = { payload:fpath }; node.error(error,msg); }); From 51f875c02d8f2ce43580d36923558a0e39c004ea Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 23 Sep 2018 10:35:47 +0100 Subject: [PATCH 3/7] reset join without sending part array (thought this had been fixed already ?) --- packages/node_modules/@node-red/nodes/core/logic/17-split.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/nodes/core/logic/17-split.js b/packages/node_modules/@node-red/nodes/core/logic/17-split.js index f5ad199ca..2c8d48ebc 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/17-split.js +++ b/packages/node_modules/@node-red/nodes/core/logic/17-split.js @@ -598,6 +598,7 @@ module.exports = function(RED) { return; } + if (msg.hasOwnProperty("reset")) { if (inflight[partid]) { delete inflight[partId] } return; } if (!inflight.hasOwnProperty(partId)) { if (payloadType === 'object' || payloadType === 'merged') { inflight[partId] = { From fde157ff506131fbe4b70aa97f7a672ca763e511 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 23 Sep 2018 10:36:50 +0100 Subject: [PATCH 4/7] remove cr lf from incoming filename so easier to pass in results from exec node. and add test --- .../@node-red/nodes/core/storage/50-file.js | 2 +- test/nodes/core/storage/50-file_spec.js | 32 ++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/50-file.js b/packages/node_modules/@node-red/nodes/core/storage/50-file.js index 76cedb136..d55782785 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/50-file.js +++ b/packages/node_modules/@node-red/nodes/core/storage/50-file.js @@ -169,7 +169,7 @@ module.exports = function(RED) { var node = this; this.on("input",function(msg) { - var filename = node.filename || msg.filename || ""; + var filename = (node.filename || msg.filename || "").replace(/\t|\r|\n/g,''); if (!node.filename) { node.status({fill:"grey",shape:"dot",text:filename}); } diff --git a/test/nodes/core/storage/50-file_spec.js b/test/nodes/core/storage/50-file_spec.js index da1d97468..901592ecc 100644 --- a/test/nodes/core/storage/50-file_spec.js +++ b/test/nodes/core/storage/50-file_spec.js @@ -140,7 +140,7 @@ describe('file Nodes', function() { var n2 = helper.getNode("helperNode1"); var data = ["one", "two", "three", "four"]; var count = 0; - + n2.on("input", function (msg) { try { msg.should.have.property("payload"); @@ -174,7 +174,7 @@ describe('file Nodes', function() { done(e); } }); - + // Send two messages to the file n1.receive({payload:"one"}); n1.receive({payload:"two"}); @@ -193,7 +193,7 @@ describe('file Nodes', function() { var n2 = helper.getNode("helperNode1"); var data = ["one", "two", "three", "four"]; var count = 0; - + n2.on("input", function (msg) { try { msg.should.have.property("payload"); @@ -254,7 +254,7 @@ describe('file Nodes', function() { helper.load(fileNode, flow, function() { var n1 = helper.getNode("fileNode1"); var n2 = helper.getNode("helperNode1"); - + n2.on("input", function (msg) { try { msg.should.have.property("payload", "fine"); @@ -286,7 +286,7 @@ describe('file Nodes', function() { helper.load(fileNode, flow, function() { var n1 = helper.getNode("fileNode1"); var n2 = helper.getNode("helperNode1"); - + n2.on("input", function (msg) { try { var f = fs.readFileSync(fileToTest).toString(); @@ -547,6 +547,7 @@ describe('file Nodes', function() { var resourcesDir = path.join(__dirname,"..","..","..","resources"); var fileToTest = path.join(resourcesDir,"50-file-test-file.txt"); + var fileToTest2 = "\t"+path.join(resourcesDir,"50-file-test-file.txt")+"\r\n"; var wait = 150; beforeEach(function(done) { @@ -608,6 +609,27 @@ describe('file Nodes', function() { }); }); + it('should read in a file ending in cr and output a utf8 string', function(done) { + var flow = [{id:"fileInNode1", type:"file in", name: "fileInNode", "filename":fileToTest2, "format":"utf8", wires:[["n2"]]}, + {id:"n2", type:"helper"}]; + helper.load(fileNode, flow, function() { + var n1 = helper.getNode("fileInNode1"); + var n2 = helper.getNode("n2"); + n2.on("input", function(msg) { + try { + msg.should.have.property('payload'); + msg.payload.should.be.a.String(); + msg.payload.should.have.length(40) + msg.payload.should.equal("File message line 1\nFile message line 2\n"); + done(); + } catch(err) { + done(err); + } + }); + n1.receive({payload:""}); + }); + }); + it('should read in a file and output split lines with parts', function(done) { var flow = [{id:"fileInNode1", type:"file in", name: "fileInNode", filename:fileToTest, format:"lines", wires:[["n2"]]}, {id:"n2", type:"helper"}]; From c6a1c8e8c4d42e7a5519c730e49962d4b597875b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 25 Sep 2018 08:40:29 +0100 Subject: [PATCH 5/7] Fix corruption of websocket _session --- packages/node_modules/@node-red/nodes/core/io/22-websocket.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js index 55964062d..26bd430b5 100644 --- a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js @@ -250,10 +250,10 @@ module.exports = function(RED) { this.on("input", function(msg) { var payload; if (this.serverConfig.wholemsg) { - var sess = ""+msg._session; + var sess = JSON.stringify(msg._session); delete msg._session; payload = JSON.stringify(msg); - msg._session = sess; + msg._session = JSON.parse(sess); } else if (msg.hasOwnProperty("payload")) { if (!Buffer.isBuffer(msg.payload)) { // if it's not a buffer make sure it's a string. From 1a7868159a4b7f3a2cceaf4c6803b145778e56af Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 25 Sep 2018 08:43:53 +0100 Subject: [PATCH 6/7] Split/join - add msg.reset to info panel --- packages/node_modules/@node-red/nodes/core/logic/17-split.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/nodes/core/logic/17-split.html b/packages/node_modules/@node-red/nodes/core/logic/17-split.html index fccb8c0d0..86b0223b9 100644 --- a/packages/node_modules/@node-red/nodes/core/logic/17-split.html +++ b/packages/node_modules/@node-red/nodes/core/logic/17-split.html @@ -297,6 +297,8 @@

A timeout can be set to trigger sending the new message using whatever has been received so far.

If a message is received with the msg.complete property set, the output message is finalised and sent. This resets any part counts.

+

If a message is received with the msg.reset property set, the partly complete message is deleted and not sent. + This resets any part counts.

Reduce Sequence mode

When configured to join in reduce mode, an expression is applied to each From c9dc9b4fe951140b15222d3143b2d13bfbf1bf2e Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 26 Sep 2018 16:03:22 +0100 Subject: [PATCH 7/7] fix websocket feedback test - now doesn't spin --- .../@node-red/nodes/core/io/22-websocket.js | 5 +++-- test/nodes/core/io/22-websocket_spec.js | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js index 26bd430b5..2abef30a5 100644 --- a/packages/node_modules/@node-red/nodes/core/io/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/io/22-websocket.js @@ -250,10 +250,11 @@ module.exports = function(RED) { this.on("input", function(msg) { var payload; if (this.serverConfig.wholemsg) { - var sess = JSON.stringify(msg._session); + var sess; + if (msg._session) { sess = JSON.stringify(msg._session); } delete msg._session; payload = JSON.stringify(msg); - msg._session = JSON.parse(sess); + if (sess) { msg._session = JSON.parse(sess); } } else if (msg.hasOwnProperty("payload")) { if (!Buffer.isBuffer(msg.payload)) { // if it's not a buffer make sure it's a string. diff --git a/test/nodes/core/io/22-websocket_spec.js b/test/nodes/core/io/22-websocket_spec.js index 72ff30765..18efbd028 100644 --- a/test/nodes/core/io/22-websocket_spec.js +++ b/test/nodes/core/io/22-websocket_spec.js @@ -481,7 +481,7 @@ describe('websocket Node', function() { }); }); - it('should feedback', function(done) { + it('should NOT feedback more than once', function(done) { var flow = [ { id: "server", type: "websocket-listener", path: "/ws", wholemsg: "true" }, { id: "client", type: "websocket-client", path: getWsUrl("/ws"), wholemsg: "true" }, @@ -497,11 +497,13 @@ describe('websocket Node', function() { }); var acc = 0; helper.getNode("output").on("input", function(msg) { - if (acc++ > 20) { - helper.clearFlows(); - done(); - } + acc = acc + 1; }); + setTimeout( function() { + acc.should.equal(1); + helper.clearFlows(); + done(); + }, 250); }); }); });