port-mux

Multiplex multiple services through one (TCP) port.

node-port-mux

Multiplex multiple services through one (TCP) port.

The muxer basically sniffs the initial data packet sent by the client to determine (using a rule set) where to forward the request to.

Instead of having to expose all your services to the outside world on their respective ports, use a single port to access them all. Initially created to multiplex HTTP, HTTPS and SOCKS5 traffic over one port for a personal project.

From the NPM repository:

$ npm install port-mux

From the Github repository:

$ git clone https://github.com/robertklep/node-port-mux.git
$ cd node-port-mux
$ npm install [-g]
var Muxer = require('port-mux');
 
// instantiate Muxer 
Muxer()
  // match HTTP GET requests (using a prefix string match) and forward them to localhost:80 
  .addRule('GET ', 80)
 
  // match TLS (HTTPS) requests (versions 3.{0,1,2,3}) using a regular expression 
  .addRule(/^\x16\x03[\x00-\x03]/, '192.168.1.1:443') // regex match 
 
  // you can also proxy UNIX domain sockets (which should already exist when you call .addRule()): 
  .addRule(..., '/tmp/my-unix-domain-socket')
 
  // you can also pass a matcher function: 
  .addRule(function(chunk) {
    // - chunk is a Buffer 
    // - if the function returns true, the match is considered a success. 
  }, ...)
 
  // pass a function as a third argument and it will get called (once the proxy 
  // has connected to the service) using the proxy connection and original 
  // (incoming) connection as arguments: 
  .addRule(..., ..., function(proxyconn) {
    var addr = proxy.address();
    console.log('Incoming connection from %s passed to %s:%s',
      conn.remoteAddress,
      addr.address,
      addr.port
    );
  })
 
  // start listening on port 3000 
  .listen(3000);

There's going to be a performance impact when using this module, since it's proxying connections to the endpoint.

Using httperf, these are the results I get on a Macbook Pro (using the modified version of the example.js script in the repository):

Type of connectionReqs/sI/O speedRemarks
Direct99911863 KB/saccess HTTP server directly (not muxed)
Muxed (TCP)4881910 KB/sHTTP server uses TCP sockets
Muxed (UNIX)56291050 KB/sHTTP server uses UNIX domain sockets

So performance impact is about 50%, a bit less when you use UNIX domain sockets.

Simplified BSD License ( BSD-2-Clause ).