node-tcp-proxy
Advanced tools
Comparing version 0.0.7 to 0.0.8
@@ -5,3 +5,3 @@ { | ||
"license": "MIT", | ||
"version": "0.0.7", | ||
"version": "0.0.8", | ||
"main": "index.js", | ||
@@ -8,0 +8,0 @@ "repository": { |
@@ -1,2 +0,2 @@ | ||
# node-tcp-proxy [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e3d035c4b78445bbec6fb348cf027e1)](https://www.codacy.com/app/tewarid/node-tcp-proxy?utm_source=github.com&utm_medium=referral&utm_content=tewarid/node-tcp-proxy&utm_campaign=Badge_Grade) | ||
# node-tcp-proxy [![Codacy Badge](https://api.codacy.com/project/badge/Grade/3e3d035c4b78445bbec6fb348cf027e1)](https://www.codacy.com/app/tewarid/node-tcp-proxy?utm_source=github.com&utm_medium=referral&utm_content=tewarid/node-tcp-proxy&utm_campaign=Badge_Grade) [![Maintainability](https://api.codeclimate.com/v1/badges/119038e281e93a7d5d05/maintainability)](https://codeclimate.com/github/tewarid/node-tcp-proxy/maintainability) | ||
@@ -3,0 +3,0 @@ A simple TCP proxy that may be used to access a service on another network. An extensible replacement for socat when used thus |
#!/usr/bin/env node | ||
var proxy = require("./tcp-proxy.js"); | ||
@@ -16,11 +15,12 @@ var argv = require("optimist") | ||
var newProxy = proxy.createProxy(argv.proxyPort, argv.serviceHost, | ||
argv.servicePort, options); | ||
const proxy = require("./tcp-proxy.js") | ||
.createProxy(argv.proxyPort, argv.serviceHost, | ||
argv.servicePort, options); | ||
process.on("uncaughtException", function(err) { | ||
console.info(err); | ||
}); | ||
process.on("SIGINT", function() { | ||
newProxy.end(); | ||
proxy.end(); | ||
}); |
@@ -12,3 +12,9 @@ var net = require("net"); | ||
this.servicePort = servicePort; | ||
this.options = options; | ||
if (options === undefined) { | ||
this.options = { | ||
quiet: false | ||
}; | ||
} else { | ||
this.options = options; | ||
} | ||
this.proxySockets = {}; | ||
@@ -20,47 +26,17 @@ | ||
TcpProxy.prototype.createProxy = function() { | ||
this.log("proxy listening at port " + this.proxyPort); | ||
const proxy = this; | ||
proxy.server = net.createServer(function(proxySocket) { | ||
var key = uniqueKey(proxySocket); | ||
proxy.log("client connected from " + key); | ||
proxy.proxySockets[key] = proxySocket; | ||
var connected = false; | ||
var buffers = []; | ||
var serviceSocket = new net.Socket(); | ||
serviceSocket.connect(proxy.servicePort, | ||
proxy.serviceHost, function() { | ||
connected = true; | ||
if (buffers.length > 0) { | ||
for (var i = 0; i < buffers.length; i++) { | ||
serviceSocket.write(buffers[i]); | ||
} | ||
} | ||
}); | ||
serviceSocket.on("data", function(data) { | ||
proxySocket.write(data); | ||
}); | ||
serviceSocket.on("close", function(hadError) { | ||
proxy.log("service socket closed"); | ||
proxy.log(" ending proxy socket"); | ||
proxySocket.destroy(); | ||
}); | ||
serviceSocket.on("error", function(e) { | ||
proxy.log("service socket error"); | ||
proxy.log(e); | ||
proxy.log(" ending proxy socket"); | ||
proxySocket.destroy(); | ||
}); | ||
proxySocket.on("error", function(e) { | ||
proxy.log("proxy socket error"); | ||
proxy.log(e); | ||
}); | ||
var context = { | ||
buffers: [], | ||
connected: false, | ||
proxySocket: proxySocket | ||
}; | ||
proxy.createServiceSocket(context); | ||
proxySocket.on("data", function(data) { | ||
if (connected) { | ||
serviceSocket.write(data); | ||
if (context.connected) { | ||
context.serviceSocket.write(data); | ||
} else { | ||
buffers[buffers.length] = data; | ||
context.buffers[context.buffers.length] = data; | ||
} | ||
@@ -70,14 +46,33 @@ }); | ||
delete proxy.proxySockets[uniqueKey(proxySocket)]; | ||
serviceSocket.destroy(); | ||
context.serviceSocket.destroy(); | ||
}); | ||
}); | ||
if (proxy.options) { | ||
proxy.server.listen(proxy.proxyPort, proxy.options.hostname); | ||
} else { | ||
proxy.server.listen(proxy.proxyPort); | ||
} | ||
proxy.server.listen(proxy.proxyPort, proxy.options.hostname); | ||
}; | ||
TcpProxy.prototype.createServiceSocket = function(context) { | ||
const proxy = this; | ||
context.serviceSocket = new net.Socket(); | ||
context.serviceSocket.connect(proxy.servicePort, proxy.serviceHost, | ||
function() { | ||
context.connected = true; | ||
if (context.buffers.length > 0) { | ||
for (var i = 0; i < context.buffers.length; i++) { | ||
context.serviceSocket.write(context.buffers[i]); | ||
} | ||
} | ||
}); | ||
context.serviceSocket.on("data", function(data) { | ||
context.proxySocket.write(data); | ||
}); | ||
context.serviceSocket.on("close", function(hadError) { | ||
context.proxySocket.destroy(); | ||
}); | ||
context.serviceSocket.on("error", function(e) { | ||
context.proxySocket.destroy(); | ||
}); | ||
return context; | ||
} | ||
TcpProxy.prototype.end = function() { | ||
this.log("terminating proxy"); | ||
this.server.close(); | ||
@@ -91,3 +86,3 @@ for (var key in this.proxySockets) { | ||
TcpProxy.prototype.log = function(msg) { | ||
if (!this.options || !this.options.quiet) { | ||
if (!this.options.quiet) { | ||
console.log(msg); | ||
@@ -94,0 +89,0 @@ } |
6862
122