UNPKG

thali

Version:
119 lines (92 loc) 3.47 kB
var net = require('net'); var multiplex = require('multiplex'); function muxServerBridge(tcpEndpointServerPort) { // Keep track of all the client sockets we've seen var clientSockets = []; var server = net.createServer(function(incomingClientSocket) { incomingClientSocket.on('close', function () { // Remove the closed socket from out records, destroying (by // unref-fing) the multiplexer (we hope) console.log('server bridge: socket closed'); clientSockets.splice(clientSockets.indexOf(incomingClientSocket), 1); }); incomingClientSocket.on('timeout', function () { console.log('incoming client socket timeout'); }); incomingClientSocket.on('error', function (err) { console.log('incoming client socket error %s', err); }); console.log('server bridge: new client socket'); // We'll need a new multiplex object for each incoming socket var serverPlex = multiplex({}, function(stream, id) { var clientSocket = net.createConnection({port: tcpEndpointServerPort}); stream.pipe(clientSocket).pipe(stream); }); // Record the mapping between incoming socket and multiplex clientSockets.push(incomingClientSocket); incomingClientSocket.pipe(serverPlex).pipe(incomingClientSocket); }); server.on('error', function (err) { console.log('mux server bridge error %s', err); }); server.on('close', function () { console.log('mux server bridge listener closed'); }); server.exit = function() { console.log('server bridge: server exiting (%d)', clientSockets.length); // Shutdown all the connected sockets clientSockets.forEach(function (sock) { sock.end(); }); clientSockets = []; this.close(); }; return server; } function muxClientBridge(localP2PTcpServerPort, cb) { var clientPlex = multiplex(); var clientSocket = net.createConnection({port: localP2PTcpServerPort}, function () { cb(); }); clientSocket.on('error', function (err) { cb(err); }); // Keep track of all the client sockets we've seen var clientSockets = []; var server = net.createServer(function(incomingClientSocket) { var clientStream = clientPlex.createStream(); incomingClientSocket.on('close', function () { // Remove the closed socket from out records, destroying (by // unref-fing) the multiplexer (we hope) console.log('client bridge: socket closed'); clientSockets.splice(clientSockets.indexOf(incomingClientSocket), 1); }); incomingClientSocket.on('timeout', function () { console.log('incoming client socket timeout'); }); incomingClientSocket.on('error', function (err) { console.log('incoming client socket error %s', err); }); console.log('client bridge: new client socket'); clientSockets.push(incomingClientSocket); incomingClientSocket.pipe(clientStream).pipe(incomingClientSocket); }); server.on('error', function (err) { console.log('mux client bridge error %s', err); }); clientPlex.pipe(clientSocket).pipe(clientPlex); server.exit = function() { console.log('client bridge: server exiting (%d)', clientSockets.length); // Shutdown all the connected sockets clientSockets.forEach(function (sock) { sock.end(); }); clientSockets = []; this.close(); }; return server; } module.exports = { muxServerBridge: muxServerBridge, muxClientBridge: muxClientBridge };