mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Collapse TCP nodes into single pair of files
This commit is contained in:
parent
2a5f4abd49
commit
d2208fae83
@ -114,3 +114,74 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script type="text/x-red" data-template-name="tcp out">
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-beserver"><i class="icon-resize-small"></i> Type</label>
|
||||||
|
<select id="node-input-beserver" style="width:120px; margin-right:5px;">
|
||||||
|
<option value="server">Listen on</option>
|
||||||
|
<option value="client">Connect to</option>
|
||||||
|
</select>
|
||||||
|
port <input type="text" id="node-input-port" style="width: 50px">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row hidden" id="node-input-host-row" style="padding-left: 110px;">
|
||||||
|
at host <input type="text" id="node-input-host" placeholder="localhost" style="width: 40%;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<label> </label>
|
||||||
|
<input type="checkbox" id="node-input-base64" placeholder="base64" style="display: inline-block; width: auto; vertical-align: top;">
|
||||||
|
<label for="node-input-base64" style="width: 70%;">Decode Base64 message ?</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
|
||||||
|
<input type="text" id="node-input-name" placeholder="Name">
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/x-red" data-help-name="tcp out">
|
||||||
|
<p>Provides a choice of tcp outputs. Can either connect to a remote tcp port,
|
||||||
|
or accept incoming connections.</p>
|
||||||
|
<p>Only <b>msg.payload</b> is sent.</p>
|
||||||
|
<p>If <b>msg.payload</b> is a string containing a base64 encoding of binary
|
||||||
|
data, the Base64 decoding option will cause it to be converted back to binary
|
||||||
|
before being sent.</p>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
RED.nodes.registerType('tcp out',{
|
||||||
|
category: 'output',
|
||||||
|
color:"Silver",
|
||||||
|
defaults: {
|
||||||
|
host: {value:"",validate:function(v) { return (this.beserver == "server")||v.length > 0;} },
|
||||||
|
port: {value:"",required:true},
|
||||||
|
beserver: {value:"client",required:true},
|
||||||
|
base64: {value:false,required:true},
|
||||||
|
name: {value:""}
|
||||||
|
},
|
||||||
|
inputs:1,
|
||||||
|
outputs:0,
|
||||||
|
icon: "bridge-dash.png",
|
||||||
|
align: "right",
|
||||||
|
label: function() {
|
||||||
|
return this.name || "tcp:"+(this.host?this.host+":":"")+this.port;
|
||||||
|
},
|
||||||
|
labelStyle: function() {
|
||||||
|
return (this.name)?"node_label_italic":"";
|
||||||
|
},
|
||||||
|
oneditprepare: function() {
|
||||||
|
var updateOptions = function() {
|
||||||
|
var sockettype = $("#node-input-beserver option:selected").val();
|
||||||
|
if (sockettype == "client") {
|
||||||
|
$("#node-input-host-row").show();
|
||||||
|
} else {
|
||||||
|
$("#node-input-host-row").hide();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
updateOptions();
|
||||||
|
$("#node-input-beserver").change(updateOptions);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@ -88,11 +88,11 @@ function TcpIn(n) {
|
|||||||
}
|
}
|
||||||
setupTcpClient();
|
setupTcpClient();
|
||||||
|
|
||||||
this._close = function() {
|
this.on('close', function() {
|
||||||
this.closing = true;
|
this.closing = true;
|
||||||
client.end();
|
client.end();
|
||||||
clearTimeout(reconnectTimeout);
|
clearTimeout(reconnectTimeout);
|
||||||
}
|
});
|
||||||
} else {
|
} else {
|
||||||
var server = net.createServer(function (socket) {
|
var server = net.createServer(function (socket) {
|
||||||
var buffer = (node.datatype == 'buffer')? new Buffer(0):"";
|
var buffer = (node.datatype == 'buffer')? new Buffer(0):"";
|
||||||
@ -106,7 +106,7 @@ function TcpIn(n) {
|
|||||||
buffer = buffer+data;
|
buffer = buffer+data;
|
||||||
var parts = buffer.split(node.newline);
|
var parts = buffer.split(node.newline);
|
||||||
for (var i = 0;i<parts.length-1;i+=1) {
|
for (var i = 0;i<parts.length-1;i+=1) {
|
||||||
var msg = {topic:node.topic, payload:parts[i]};
|
var msg = {topic:node.topic, payload:parts[i],ip:socket.remoteAddress,port:socket.remotePort};
|
||||||
node.send(msg);
|
node.send(msg);
|
||||||
}
|
}
|
||||||
buffer = parts[parts.length-1];
|
buffer = parts[parts.length-1];
|
||||||
@ -136,17 +136,118 @@ function TcpIn(n) {
|
|||||||
server.listen(node.port);
|
server.listen(node.port);
|
||||||
node.log('listening on port '+node.port);
|
node.log('listening on port '+node.port);
|
||||||
|
|
||||||
this._close = function() {
|
this.on('close', function() {
|
||||||
this.closing = true;
|
this.closing = true;
|
||||||
server.close();
|
server.close();
|
||||||
node.log('stopped listening on port '+node.port);
|
node.log('stopped listening on port '+node.port);
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RED.nodes.registerType("tcp in",TcpIn);
|
RED.nodes.registerType("tcp in",TcpIn);
|
||||||
|
|
||||||
TcpIn.prototype.close = function() {
|
function TcpOut(n) {
|
||||||
this._close();
|
RED.nodes.createNode(this,n);
|
||||||
|
this.host = n.host;
|
||||||
|
this.port = n.port * 1;
|
||||||
|
this.base64 = n.base64;
|
||||||
|
this.beserver = n.beserver;
|
||||||
|
this.name = n.name;
|
||||||
|
this.closing = false;
|
||||||
|
var node = this;
|
||||||
|
|
||||||
|
if (!node.beserver||node.beserver=="client") {
|
||||||
|
var reconnectTimeout;
|
||||||
|
var client = null;
|
||||||
|
var connected = false;
|
||||||
|
|
||||||
|
function setupTcpClient() {
|
||||||
|
node.log("connecting to "+node.host+":"+node.port);
|
||||||
|
client = net.connect(node.port, node.host, function() {
|
||||||
|
connected = true;
|
||||||
|
node.log("connected to "+node.host+":"+node.port);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('error', function (err) {
|
||||||
|
node.log('error : '+err);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('end', function (err) {
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('close', function() {
|
||||||
|
node.log("connection lost to "+node.host+":"+node.port);
|
||||||
|
connected = false;
|
||||||
|
client.destroy();
|
||||||
|
if (!node.closing) {
|
||||||
|
reconnectTimeout = setTimeout(setupTcpClient,reconnectTime);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setupTcpClient();
|
||||||
|
|
||||||
|
|
||||||
|
node.on("input", function(msg) {
|
||||||
|
if (connected && msg.payload != null) {
|
||||||
|
if (Buffer.isBuffer(msg.payload)) {
|
||||||
|
client.write(msg.payload);
|
||||||
|
} else if (typeof msg.payload === "string" && node.base64) {
|
||||||
|
client.write(new Buffer(msg.payload,'base64'));
|
||||||
|
} else {
|
||||||
|
client.write(new Buffer(""+msg.payload));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
node.on("close", function() {
|
||||||
|
this.closing = true;
|
||||||
|
client.end();
|
||||||
|
clearTimeout(reconnectTimeout);
|
||||||
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
var connectedSockets = [];
|
||||||
|
var server = net.createServer(function (socket) {
|
||||||
|
var remoteDetails = socket.remoteAddress+":"+socket.remotePort;
|
||||||
|
node.log("connection from "+remoteDetails);
|
||||||
|
connectedSockets.push(socket);
|
||||||
|
socket.on('close',function() {
|
||||||
|
node.log("connection closed from "+remoteDetails);
|
||||||
|
connectedSockets.splice(connectedSockets.indexOf(socket),1);
|
||||||
|
});
|
||||||
|
socket.on('error',function() {
|
||||||
|
node.log("socket error from "+remoteDetails);
|
||||||
|
connectedSockets.splice(connectedSockets.indexOf(socket),1);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
node.on("input", function(msg) {
|
||||||
|
if (msg.payload != null) {
|
||||||
|
var buffer;
|
||||||
|
if (Buffer.isBuffer(msg.payload)) {
|
||||||
|
buffer = msg.payload;
|
||||||
|
} else if (typeof msg.payload === "string" && node.base64) {
|
||||||
|
buffer = new Buffer(msg.payload,'base64');
|
||||||
|
} else {
|
||||||
|
buffer = new Buffer(""+msg.payload);
|
||||||
|
}
|
||||||
|
for (var i = 0; i<connectedSockets.length;i+=1) {
|
||||||
|
connectedSockets[i].write(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(node.port);
|
||||||
|
node.log('listening on port '+node.port);
|
||||||
|
|
||||||
|
node.on('close', function() {
|
||||||
|
server.close();
|
||||||
|
node.log('stopped listening on port '+node.port);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RED.nodes.registerType("tcp out",TcpOut);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
<!--
|
|
||||||
Copyright 2013 IBM Corp.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<script type="text/x-red" data-template-name="tcp out">
|
|
||||||
<div class="form-row">
|
|
||||||
<label for="node-input-beserver"><i class="icon-resize-small"></i> Type</label>
|
|
||||||
<select id="node-input-beserver" style="width:120px; margin-right:5px;">
|
|
||||||
<option value="server">Listen on</option>
|
|
||||||
<option value="client">Connect to</option>
|
|
||||||
</select>
|
|
||||||
port <input type="text" id="node-input-port" style="width: 50px">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-row hidden" id="node-input-host-row" style="padding-left: 110px;">
|
|
||||||
at host <input type="text" id="node-input-host" placeholder="localhost" style="width: 40%;">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-row">
|
|
||||||
<label> </label>
|
|
||||||
<input type="checkbox" id="node-input-base64" placeholder="base64" style="display: inline-block; width: auto; vertical-align: top;">
|
|
||||||
<label for="node-input-base64" style="width: 70%;">Decode Base64 message ?</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-row">
|
|
||||||
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
|
|
||||||
<input type="text" id="node-input-name" placeholder="Name">
|
|
||||||
</div>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/x-red" data-help-name="tcp out">
|
|
||||||
<p>Provides a choice of tcp outputs. Can either connect to a remote tcp port,
|
|
||||||
or accept incoming connections.</p>
|
|
||||||
<p>Only <b>msg.payload</b> is sent.</p>
|
|
||||||
<p>If <b>msg.payload</b> is a string containing a base64 encoding of binary
|
|
||||||
data, the Base64 decoding option will cause it to be converted back to binary
|
|
||||||
before being sent.</p>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
RED.nodes.registerType('tcp out',{
|
|
||||||
category: 'output',
|
|
||||||
color:"Silver",
|
|
||||||
defaults: {
|
|
||||||
host: {value:"",validate:function(v) { return (this.beserver == "server")||v.length > 0;} },
|
|
||||||
port: {value:"",required:true},
|
|
||||||
beserver: {value:"client",required:true},
|
|
||||||
base64: {value:false,required:true},
|
|
||||||
name: {value:""}
|
|
||||||
},
|
|
||||||
inputs:1,
|
|
||||||
outputs:0,
|
|
||||||
icon: "bridge-dash.png",
|
|
||||||
align: "right",
|
|
||||||
label: function() {
|
|
||||||
return this.name || "tcp:"+(this.host?this.host+":":"")+this.port;
|
|
||||||
},
|
|
||||||
labelStyle: function() {
|
|
||||||
return (this.name)?"node_label_italic":"";
|
|
||||||
},
|
|
||||||
oneditprepare: function() {
|
|
||||||
var updateOptions = function() {
|
|
||||||
var sockettype = $("#node-input-beserver option:selected").val();
|
|
||||||
if (sockettype == "client") {
|
|
||||||
$("#node-input-host-row").show();
|
|
||||||
} else {
|
|
||||||
$("#node-input-host-row").hide();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
updateOptions();
|
|
||||||
$("#node-input-beserver").change(updateOptions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,123 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2013 IBM Corp.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
**/
|
|
||||||
|
|
||||||
var RED = require("../../red/red");
|
|
||||||
var reconnectTime = RED.settings.socketReconnectTime||10000;
|
|
||||||
var net = require('net');
|
|
||||||
|
|
||||||
function TcpOut(n) {
|
|
||||||
RED.nodes.createNode(this,n);
|
|
||||||
this.host = n.host;
|
|
||||||
this.port = n.port * 1;
|
|
||||||
this.base64 = n.base64;
|
|
||||||
this.beserver = n.beserver;
|
|
||||||
this.name = n.name;
|
|
||||||
this.closing = false;
|
|
||||||
var node = this;
|
|
||||||
|
|
||||||
if (!node.beserver||node.beserver=="client") {
|
|
||||||
var reconnectTimeout;
|
|
||||||
var client = null;
|
|
||||||
var connected = false;
|
|
||||||
|
|
||||||
function setupTcpClient() {
|
|
||||||
node.log("connecting to "+node.host+":"+node.port);
|
|
||||||
client = net.connect(node.port, node.host, function() {
|
|
||||||
connected = true;
|
|
||||||
node.log("connected to "+node.host+":"+node.port);
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('error', function (err) {
|
|
||||||
node.log('error : '+err);
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('end', function (err) {
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('close', function() {
|
|
||||||
node.log("connection lost to "+node.host+":"+node.port);
|
|
||||||
connected = false;
|
|
||||||
client.destroy();
|
|
||||||
if (!node.closing) {
|
|
||||||
reconnectTimeout = setTimeout(setupTcpClient,reconnectTime);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
setupTcpClient();
|
|
||||||
|
|
||||||
|
|
||||||
node.on("input", function(msg) {
|
|
||||||
if (connected && msg.payload != null) {
|
|
||||||
if (Buffer.isBuffer(msg.payload)) {
|
|
||||||
client.write(msg.payload);
|
|
||||||
} else if (typeof msg.payload === "string" && node.base64) {
|
|
||||||
client.write(new Buffer(msg.payload,'base64'));
|
|
||||||
} else {
|
|
||||||
client.write(new Buffer(""+msg.payload));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
node.on("close", function() {
|
|
||||||
this.closing = true;
|
|
||||||
client.end();
|
|
||||||
clearTimeout(reconnectTimeout);
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
var connectedSockets = [];
|
|
||||||
var server = net.createServer(function (socket) {
|
|
||||||
var remoteDetails = socket.remoteAddress+":"+socket.remotePort;
|
|
||||||
node.log("connection from "+remoteDetails);
|
|
||||||
connectedSockets.push(socket);
|
|
||||||
socket.on('close',function() {
|
|
||||||
node.log("connection closed from "+remoteDetails);
|
|
||||||
connectedSockets.splice(connectedSockets.indexOf(socket),1);
|
|
||||||
});
|
|
||||||
socket.on('error',function() {
|
|
||||||
node.log("socket error from "+remoteDetails);
|
|
||||||
connectedSockets.splice(connectedSockets.indexOf(socket),1);
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
node.on("input", function(msg) {
|
|
||||||
if (msg.payload != null) {
|
|
||||||
var buffer;
|
|
||||||
if (Buffer.isBuffer(msg.payload)) {
|
|
||||||
buffer = msg.payload;
|
|
||||||
} else if (typeof msg.payload === "string" && node.base64) {
|
|
||||||
buffer = new Buffer(msg.payload,'base64');
|
|
||||||
} else {
|
|
||||||
buffer = new Buffer(""+msg.payload);
|
|
||||||
}
|
|
||||||
for (var i = 0; i<connectedSockets.length;i+=1) {
|
|
||||||
connectedSockets[i].write(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
server.listen(node.port);
|
|
||||||
node.log('listening on port '+node.port);
|
|
||||||
|
|
||||||
node.on('close', function() {
|
|
||||||
server.close();
|
|
||||||
node.log('stopped listening on port '+node.port);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RED.nodes.registerType("tcp out",TcpOut);
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user