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..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,9 +250,13 @@ module.exports = function(RED) { this.on("input", function(msg) { var payload; if (this.serverConfig.wholemsg) { + var sess; + if (msg._session) { sess = JSON.stringify(msg._session); } delete msg._session; payload = JSON.stringify(msg); - } else if (msg.hasOwnProperty("payload")) { + 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. payload = RED.util.ensureString(msg.payload); } 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); }); 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 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] = { 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/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); }); }); }); 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"}];