From f4d7b719843a0ae215914bf6532e875062c1df10 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 4 Oct 2022 15:20:06 +0100 Subject: [PATCH 1/8] Ensure errors in preDeliver callback are handled Fixes #3848 --- .../@node-red/runtime/lib/flows/Flow.js | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js index b5685d3ec..6da07f495 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js @@ -818,6 +818,17 @@ function handlePreRoute(flow, sendEvent, reportError) { }) } +function deliverMessageToDestination(sendEvent) { + if (sendEvent.destination.node) { + try { + sendEvent.destination.node.receive(sendEvent.msg); + } catch(err) { + const info = `${sendEvent.destination.node?.id}` + Log.error(`Error delivering message to node:${sendEvent.destination.node._path} [${sendEvent.destination.node.type}]`) + Log.error(err.stack) + } + } +} function handlePreDeliver(flow,sendEvent, reportError) { // preDeliver - the local router has identified the node it is going to send to. At this point, the message has been cloned if needed. hooks.trigger("preDeliver",sendEvent,(err) => { @@ -827,15 +838,10 @@ function handlePreDeliver(flow,sendEvent, reportError) { } else if (err !== false) { if (asyncMessageDelivery) { setImmediate(function() { - if (sendEvent.destination.node) { - sendEvent.destination.node.receive(sendEvent.msg); - } + deliverMessageToDestination(sendEvent) }) } else { - if (sendEvent.destination.node) { - sendEvent.destination.node.receive(sendEvent.msg); - - } + deliverMessageToDestination(sendEvent) } // postDeliver - the message has been dispatched to be delivered asynchronously (unless the sync delivery flag is set, in which case it would be continue as synchronous delivery) hooks.trigger("postDeliver", sendEvent, function(err) { From 79db4f8aa127554585aedab4e8f2018dd1f8f833 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 30 Nov 2022 22:22:44 +0000 Subject: [PATCH 2/8] Update packages/node_modules/@node-red/runtime/lib/flows/Flow.js Co-authored-by: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> --- packages/node_modules/@node-red/runtime/lib/flows/Flow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js index 6da07f495..c99259f1a 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js @@ -819,7 +819,7 @@ function handlePreRoute(flow, sendEvent, reportError) { } function deliverMessageToDestination(sendEvent) { - if (sendEvent.destination.node) { + if (sendEvent?.destination?.node) { try { sendEvent.destination.node.receive(sendEvent.msg); } catch(err) { From 742f05f59d31543fb5d8e1aac98eb4c9b7804f22 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 30 Nov 2022 22:23:04 +0000 Subject: [PATCH 3/8] Update packages/node_modules/@node-red/runtime/lib/flows/Flow.js --- packages/node_modules/@node-red/runtime/lib/flows/Flow.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js index c99259f1a..b5bedb2d6 100644 --- a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js +++ b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js @@ -823,7 +823,6 @@ function deliverMessageToDestination(sendEvent) { try { sendEvent.destination.node.receive(sendEvent.msg); } catch(err) { - const info = `${sendEvent.destination.node?.id}` Log.error(`Error delivering message to node:${sendEvent.destination.node._path} [${sendEvent.destination.node.type}]`) Log.error(err.stack) } From 281e9d1357dd78b5ab4e08eed3a87a5fdf9a6b1f Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 12 Oct 2022 11:12:46 +0100 Subject: [PATCH 4/8] Fix extra newline append for multipart file write ref Issue #3913 --- .../@node-red/nodes/core/storage/10-file.js | 5 +- test/nodes/core/storage/10-file_spec.js | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/storage/10-file.js b/packages/node_modules/@node-red/nodes/core/storage/10-file.js index d0db89d01..d3b8a0765 100644 --- a/packages/node_modules/@node-red/nodes/core/storage/10-file.js +++ b/packages/node_modules/@node-red/nodes/core/storage/10-file.js @@ -117,7 +117,9 @@ module.exports = function(RED) { } if (typeof data === "boolean") { data = data.toString(); } if (typeof data === "number") { data = data.toString(); } - if ((node.appendNewline) && (!Buffer.isBuffer(data))) { data += os.EOL; } + var aflg = true; + if (msg.hasOwnProperty("parts") && msg.parts.type === "string" && (msg.parts.count === msg.parts.index + 1)) { aflg = false; } + if ((node.appendNewline) && (!Buffer.isBuffer(data)) && aflg) { data += os.EOL; } var buf; if (node.encoding === "setbymsg") { buf = encode(data, msg.encoding || "none"); @@ -314,7 +316,6 @@ module.exports = function(RED) { }); filename = filename || ""; var fullFilename = filename; - var filePath = ""; if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) { fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory,filename)); } diff --git a/test/nodes/core/storage/10-file_spec.js b/test/nodes/core/storage/10-file_spec.js index 9d5aa033f..19026d457 100644 --- a/test/nodes/core/storage/10-file_spec.js +++ b/test/nodes/core/storage/10-file_spec.js @@ -194,6 +194,55 @@ describe('file Nodes', function() { }); }); + it('should append to a file and add newline, except last line of multipart input', function(done) { + var flow = [{id:"fileNode1", type:"file", name: "fileNode", "filename":fileToTest, "appendNewline":true, "overwriteFile":false, wires: [["helperNode1"]]}, + {id:"helperNode1", type:"helper"}]; + try { + fs.unlinkSync(fileToTest); + } catch(err) { + } + helper.load(fileNode, flow, function() { + var n1 = helper.getNode("fileNode1"); + var n2 = helper.getNode("helperNode1"); + var count = 0; + //var data = ["Line1", "Line2"]; + + n2.on("input", function (msg) { + try { + msg.should.have.property("payload"); + //data.should.containDeep([msg.payload]); + if (count === 3) { + var f = fs.readFileSync(fileToTest).toString(); + if (os.type() !== "Windows_NT") { + f.should.have.length(23); + f.should.equal("Line1\nLine2\nLine3\nLine4"); + } + else { + f.should.have.length(23); + f.should.equal("Line1\r\nLine2\r\nLine3\r\nLine4"); + } + done(); + } + count++; + } + catch (e) { + done(e); + } + }); + + n1.receive({payload:"Line1",parts:{index:0,type:"string"}}); // string + setTimeout(function() { + n1.receive({payload:"Line2",parts:{index:1,type:"string"}}); // string + },30); + setTimeout(function() { + n1.receive({payload:"Line3",parts:{index:2,type:"string"}}); // string + },60); + setTimeout(function() { + n1.receive({payload:"Line4",parts:{index:3,type:"string",count:4}}); // string + },90); + }); + }); + it('should append to a file after it has been deleted ', function(done) { var flow = [{id:"fileNode1", type:"file", name: "fileNode", "filename":fileToTest, "appendNewline":false, "overwriteFile":false, wires: [["helperNode1"]]}, {id:"helperNode1", type:"helper"}]; From 95a7980adaaf6499e32e2f3e6f4d4055e7ca1b8c Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Fri, 14 Oct 2022 10:02:01 +0100 Subject: [PATCH 5/8] Update tests.yml --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b7f54c5f1..28d3c1b32 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,9 +19,9 @@ jobs: matrix: node-version: [14, 16] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Install Dependencies From 892d21fb770730a2484375a70cddc6cdb13ff098 Mon Sep 17 00:00:00 2001 From: bggbr <48645202+bggbr@users.noreply.github.com> Date: Fri, 3 Feb 2023 22:23:09 +0900 Subject: [PATCH 6/8] Fix "EADDRINUSE" error --- packages/node_modules/node-red/red.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/node-red/red.js b/packages/node_modules/node-red/red.js index 4763fd5a1..2f5ab354c 100755 --- a/packages/node_modules/node-red/red.js +++ b/packages/node_modules/node-red/red.js @@ -458,7 +458,7 @@ httpsPromise.then(function(startupHttps) { RED.start().then(function() { if (settings.httpAdminRoot !== false || settings.httpNodeRoot !== false || settings.httpStatic) { server.on('error', function(err) { - if (err.errno === "EADDRINUSE") { + if (err.code === "EADDRINUSE") { RED.log.error(RED.log._("server.unable-to-listen", {listenpath:getListenPath()})); RED.log.error(RED.log._("server.port-in-use")); } else { From e30df544dbdf997d46f856b822130b807f30e79f Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sat, 25 Feb 2023 23:00:07 +0900 Subject: [PATCH 7/8] Change default file name to flows.json in project feature --- .../@node-red/editor-client/src/js/ui/projects/projects.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js index c198b34db..f32e14c33 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js @@ -747,14 +747,14 @@ RED.projects = (function() { var row = $('
').appendTo(body); $('').appendTo(row); var subrow = $('
').appendTo(row); - var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow)||"flow.json"; + var defaultFlowFile = (createProjectOptions.files &&createProjectOptions.files.flow) || (RED.settings.files && RED.settings.files.flow) || "flows.json"; projectFlowFileInput = $('').val(defaultFlowFile) .on("change keyup paste",validateForm) .appendTo(subrow); $('
').appendTo(subrow); $('').appendTo(row); - var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials)||"flow_cred.json"; + var defaultCredentialsFile = (createProjectOptions.files &&createProjectOptions.files.credentials) || (RED.settings.files && RED.settings.files.credentials) || "flows_cred.json"; row = $('
').appendTo(body); $('').appendTo(row); subrow = $('
').appendTo(row); @@ -1257,7 +1257,7 @@ RED.projects = (function() { row = $('
').appendTo(container); $('').appendTo(row); subrow = $('
').appendTo(row); - projectFlowFileInput = $('').val("flow.json") + projectFlowFileInput = $('').val("flows.json") .on("change keyup paste",validateForm) .appendTo(subrow); $('
').appendTo(subrow); From 24178beafc60cade6ac5c4682962217ec3741181 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Sun, 26 Feb 2023 15:17:45 +0000 Subject: [PATCH 8/8] update monaco docs link in settings.js closes #4074 --- packages/node_modules/node-red/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/node-red/settings.js b/packages/node_modules/node-red/settings.js index 901e69789..ac58f280a 100644 --- a/packages/node_modules/node-red/settings.js +++ b/packages/node_modules/node-red/settings.js @@ -416,7 +416,7 @@ module.exports = { */ // theme: "vs", /** other overrides can be set e.g. fontSize, fontFamily, fontLigatures etc. - * for the full list, see https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneEditorConstructionOptions.html + * for the full list, see https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneEditorConstructionOptions.html */ //fontSize: 14, //fontFamily: "Cascadia Code, Fira Code, Consolas, 'Courier New', monospace",