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.
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"}];