mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Collapse TCP nodes into single pair of files
This commit is contained in:
		@@ -114,3 +114,74 @@
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
</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();
 | 
			
		||||
 | 
			
		||||
		this._close = function() {
 | 
			
		||||
        this.on('close', function() {
 | 
			
		||||
            this.closing = true;
 | 
			
		||||
            client.end();
 | 
			
		||||
            clearTimeout(reconnectTimeout);
 | 
			
		||||
		}
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        var server = net.createServer(function (socket) {
 | 
			
		||||
                var buffer = (node.datatype == 'buffer')? new Buffer(0):"";
 | 
			
		||||
@@ -106,7 +106,7 @@ function TcpIn(n) {
 | 
			
		||||
                                buffer = buffer+data;
 | 
			
		||||
                                var parts = buffer.split(node.newline);
 | 
			
		||||
                                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);
 | 
			
		||||
                                }
 | 
			
		||||
                                buffer = parts[parts.length-1];
 | 
			
		||||
@@ -136,17 +136,118 @@ function TcpIn(n) {
 | 
			
		||||
        server.listen(node.port);
 | 
			
		||||
        node.log('listening on port '+node.port);
 | 
			
		||||
 | 
			
		||||
		this._close = function() {
 | 
			
		||||
        this.on('close', function() {
 | 
			
		||||
            this.closing = true;
 | 
			
		||||
            server.close();
 | 
			
		||||
            node.log('stopped listening on port '+node.port);
 | 
			
		||||
		}
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RED.nodes.registerType("tcp in",TcpIn);
 | 
			
		||||
 | 
			
		||||
TcpIn.prototype.close = function() {
 | 
			
		||||
	this._close();
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user