diff --git a/packages/node_modules/@node-red/nodes/core/common/21-debug.js b/packages/node_modules/@node-red/nodes/core/common/21-debug.js index 5a22194ad..fe9827fce 100644 --- a/packages/node_modules/@node-red/nodes/core/common/21-debug.js +++ b/packages/node_modules/@node-red/nodes/core/common/21-debug.js @@ -5,6 +5,7 @@ module.exports = function(RED) { const fs = require("fs-extra"); const path = require("path"); var debuglength = RED.settings.debugMaxLength || 1000; + var statuslength = RED.settings.debugStatusLength || 32; var useColors = RED.settings.debugUseColors || false; util.inspect.styles.boolean = "red"; const { hasOwnProperty } = Object.prototype; @@ -164,7 +165,7 @@ module.exports = function(RED) { } } - if (st.length > 32) { st = st.substr(0,32) + "..."; } + if (st.length > statuslength) { st = st.substr(0,statuslength) + "..."; } var newStatus = {fill:fill, shape:shape, text:st}; if (JSON.stringify(newStatus) !== node.oldState) { // only send if we have to 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 d95d03b10..15401e374 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 @@ -411,23 +411,33 @@ module.exports = function(RED) { if (msg._session && msg._session.type == "tcp") { var client = connectionPool[msg._session.id]; if (client) { - if (Buffer.isBuffer(msg.payload)) { - client.write(msg.payload); - } else if (typeof msg.payload === "string" && node.base64) { - client.write(Buffer.from(msg.payload,'base64')); - } else { - client.write(Buffer.from(""+msg.payload)); + if (msg?.reset === true) { + client.destroy(); + } + else { + if (Buffer.isBuffer(msg.payload)) { + client.write(msg.payload); + } else if (typeof msg.payload === "string" && node.base64) { + client.write(Buffer.from(msg.payload,'base64')); + } else { + client.write(Buffer.from(""+msg.payload)); + } } } } else { for (var i in connectionPool) { - if (Buffer.isBuffer(msg.payload)) { - connectionPool[i].write(msg.payload); - } else if (typeof msg.payload === "string" && node.base64) { - connectionPool[i].write(Buffer.from(msg.payload,'base64')); - } else { - connectionPool[i].write(Buffer.from(""+msg.payload)); + if (msg?.reset === true) { + connectionPool[i].destroy(); + } + else { + if (Buffer.isBuffer(msg.payload)) { + connectionPool[i].write(msg.payload); + } else if (typeof msg.payload === "string" && node.base64) { + connectionPool[i].write(Buffer.from(msg.payload,'base64')); + } else { + connectionPool[i].write(Buffer.from(""+msg.payload)); + } } } } @@ -547,13 +557,33 @@ module.exports = function(RED) { this.on("input", function(msg, nodeSend, nodeDone) { var i = 0; - if ((!Buffer.isBuffer(msg.payload)) && (typeof msg.payload !== "string")) { + if (msg.payload !== undefined && (!Buffer.isBuffer(msg.payload)) && (typeof msg.payload !== "string")) { msg.payload = msg.payload.toString(); } var host = node.server || msg.host; var port = node.port || msg.port; + if (node.out === "sit" && msg?.reset) { + if (msg.reset === true) { // kill all connections + for (var cl in clients) { + if (clients[cl].hasOwnProperty("client")) { + clients[cl].client.destroy(); + delete clients[cl]; + } + } + } + if (typeof(msg.reset) === "string" && msg.reset.includes(":")) { // just kill connection host:port + if (clients.hasOwnProperty(msg.reset) && clients[msg.reset].hasOwnProperty("client")) { + clients[msg.reset].client.destroy(); + delete clients[msg.reset]; + } + } + const cc = Object.keys(clients).length; + node.status({fill:"green",shape:cc===0?"ring":"dot",text:RED._("tcpin.status.connections",{count:cc})}); + if ((host === undefined || port === undefined) && !msg.hasOwnProperty("payload")) { return; } + } + // Store client information independently // the clients object will have: // clients[id].client, clients[id].msg, clients[id].timeout @@ -621,13 +651,16 @@ module.exports = function(RED) { clients[connection_id].connecting = true; clients[connection_id].client.connect(connOpts, function() { //node.log(RED._("tcpin.errors.client-connected")); - node.status({fill:"green",shape:"dot",text:"common.status.connected"}); + // node.status({fill:"green",shape:"dot",text:"common.status.connected"}); + node.status({fill:"green",shape:"dot",text:RED._("tcpin.status.connections",{count:Object.keys(clients).length})}); if (clients[connection_id] && clients[connection_id].client) { clients[connection_id].connected = true; clients[connection_id].connecting = false; let event; while (event = dequeue(clients[connection_id].msgQueue)) { - clients[connection_id].client.write(event.msg.payload); + if (event.msg.payload !== undefined) { + clients[connection_id].client.write(event.msg.payload); + } event.nodeDone(); } if (node.out === "time" && node.splitc < 0) { @@ -823,7 +856,9 @@ module.exports = function(RED) { else if (!clients[connection_id].connecting && clients[connection_id].connected) { if (clients[connection_id] && clients[connection_id].client) { let event = dequeue(clients[connection_id].msgQueue) - clients[connection_id].client.write(event.msg.payload); + if (event.msg.payload !== undefined ) { + clients[connection_id].client.write(event.msg.payload); + } event.nodeDone(); } } diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html index 173f003f7..708df0449 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html @@ -30,6 +30,8 @@ before being sent.

If msg._session is not present the payload is sent to all connected clients.

+

In Reply-to mode, setting msg.reset = true will reset the connection + specified by _session.id, or all connections if no _session.id is specified.

Note: On some systems you may need root or administrator access to access ports below 1024.

@@ -40,6 +42,8 @@ returned characters into a fixed buffer, match a specified character before returning, wait a fixed timeout from first reply and then return, sit and wait for data, or send then close the connection immediately, without waiting for a reply.

+

If in sit and wait mode (remain connected) you can send msg.reset = true or msg.reset = "host:port" to force a break in + the connection and an automatic reconnection.

The response will be output in msg.payload as a buffer, so you may want to .toString() it.

If you leave tcp host or port blank they must be set by using the msg.host and msg.port properties in every message sent to the node.

diff --git a/packages/node_modules/@node-red/registry/lib/externalModules.js b/packages/node_modules/@node-red/registry/lib/externalModules.js index b76f748a4..476f3dfbf 100644 --- a/packages/node_modules/@node-red/registry/lib/externalModules.js +++ b/packages/node_modules/@node-red/registry/lib/externalModules.js @@ -263,7 +263,7 @@ async function installModule(moduleDetails) { "module": moduleDetails.module, "version": moduleDetails.version, "dir": installDir, - "args": ["--production","--engine-strict"] + "args": ["--omit=dev","--engine-strict"] } return hooks.trigger("preInstall", triggerPayload).then((result) => { // preInstall passed diff --git a/packages/node_modules/@node-red/registry/lib/installer.js b/packages/node_modules/@node-red/registry/lib/installer.js index 95022fbb1..aeb22be3d 100644 --- a/packages/node_modules/@node-red/registry/lib/installer.js +++ b/packages/node_modules/@node-red/registry/lib/installer.js @@ -215,7 +215,7 @@ async function installModule(module,version,url) { "dir": installDir, "isExisting": isExisting, "isUpgrade": isUpgrade, - "args": ['--no-audit','--no-update-notifier','--no-fund','--save','--save-prefix=~','--production','--engine-strict'] + "args": ['--no-audit','--no-update-notifier','--no-fund','--save','--save-prefix=~','--omit=dev','--engine-strict'] } return hooks.trigger("preInstall", triggerPayload).then((result) => { diff --git a/packages/node_modules/node-red/settings.js b/packages/node_modules/node-red/settings.js index 80b559030..864707538 100644 --- a/packages/node_modules/node-red/settings.js +++ b/packages/node_modules/node-red/settings.js @@ -449,6 +449,7 @@ module.exports = { * - ui (for use with Node-RED Dashboard) * - debugUseColors * - debugMaxLength + * - debugStatusLength * - execMaxBufferSize * - httpRequestTimeout * - mqttReconnectTime @@ -504,6 +505,9 @@ module.exports = { /** The maximum length, in characters, of any message sent to the debug sidebar tab */ debugMaxLength: 1000, + /** The maximum length, in characters, of status messages under the debug node */ + //debugStatusLength: 32, + /** Maximum buffer size for the exec node. Defaults to 10Mb */ //execMaxBufferSize: 10000000,