wsproxyxpro
Version:
This is a websocket to tcp proxy, written in node.js. It is dynamic and will proxy to various tcp servers.
113 lines (84 loc) • 2.13 kB
JavaScript
/**
* Dependencies
*/
var http = require('http');
var https = require('https');
var fs = require('fs');
var ws = require('ws');
var modules = require('./modules');
var mes = require('./message');
/**
* Proxy constructor
*/
var Proxy = require('./proxy');
/**
* Initiate a server
*/
var Server = function Init(config) {
let opts = {
clientTracking: false,
noServer: true
}
let server;
mes.level = config.log;
console.log("Log Level : ", mes.level);
if (config.ssl) {
server = https.createServer({
key: fs.readFileSync(config.key),
cert: fs.readFileSync(config.cert),
}, function (req, res) {
res.writeHead(200);
res.end("Secure wsProxy running.\n");
});
server.listen(config.port)
mes.status("Start a secure wsProxy on port %s", config.port)
}
else {
server = http.createServer(function (req, res) {
res.writeHead(200);
res.end("wsProxy running.\n");
});
server.listen(config.port)
mes.status("Start wsProxy on port %s", config.port)
}
var WebSocketServer = new ws.Server(opts)
WebSocketServer.on('connection', onConnection);
server.on('upgrade', async function upgrade(request, socket, head) {
try {
await onRequestConnect(request);
} catch (e) {
socket.destroy();
return;
}
WebSocketServer.handleUpgrade(request, socket, head, function done(ws) {
WebSocketServer.emit('connection', ws, request);
});
});
return this;
}
/**
* Before estabilishing a connection
*/
async function onRequestConnect(info) {
return new Promise((resolve, reject) => {
// Once we get a response from our modules, pass it through
modules.method.verify(info, function (res) {
if(res) resolve();
else reject();
})
});
}
/**
* Connection passed through verify, lets initiate a proxy
*/
function onConnection(ws, req) {
ws.upgradeReq = req;
modules.method.connect(ws, function (res) {
//All modules have processed the connection, lets start the proxy
new Proxy(ws);
})
}
/**
* Exports
*/
module.exports = Server;