55 lines
1.5 KiB
JavaScript
55 lines
1.5 KiB
JavaScript
var WebSocket = require('ws');
|
|
var {parse:parseQueryString} = require('query-string');
|
|
var wss = new WebSocket.Server({
|
|
port: process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 8080
|
|
});
|
|
var conncount = 0;
|
|
wss.on('connection', function (cws, req){
|
|
var number = conncount++;
|
|
console.log(`New connection #${number} from ${req.connection.remoteAddress} with ${req.url}`);
|
|
cws.on('close', function(){
|
|
console.log(`Closing connection #${number} from ${req.connection.remoteAddress}`);
|
|
});
|
|
|
|
var querystring = req.url.substr(1);
|
|
if (!querystring) return cws.close();
|
|
var params = parseQueryString(querystring);
|
|
var target = params.target;
|
|
if (!target) return cws.close();
|
|
var headers = {};
|
|
for (let key in params) if (key != "target") headers[key] = params[key];
|
|
|
|
try {
|
|
var tws = new WebSocket(target, {headers});
|
|
} catch(e) {
|
|
console.error(e);
|
|
cws.close();
|
|
return;
|
|
}
|
|
|
|
// client to target
|
|
var messageBuffer = [];
|
|
tws.on('open', function(){
|
|
for (let message of messageBuffer) tws.send(message);
|
|
messageBuffer = undefined;
|
|
});
|
|
cws.on('message', function(message){
|
|
if (tws.readyState == WebSocket.OPEN) tws.send(message);
|
|
else if (messageBuffer) messageBuffer.push(message);
|
|
});
|
|
cws.on('close', function(){
|
|
tws.close();
|
|
messageBuffer = undefined;
|
|
});
|
|
cws.on('error', console.error);
|
|
|
|
// target to client
|
|
tws.on('message', function(message){
|
|
if (cws.readyState == WebSocket.OPEN) cws.send(message);
|
|
});
|
|
tws.on('close', function(){
|
|
cws.close();
|
|
});
|
|
tws.on('error', console.error);
|
|
});
|