node-port-mux
Multiplex multiple services through one (TCP) port.
How?
The muxer basically sniffs the initial data packet sent by the client to determine (using a rule set) where to forward the request to.
Why?
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.
Install
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]
Example
var Muxer = ; // instantiate Muxer // match HTTP GET requests (using a prefix string match) and forward them to localhost:80 // match TLS (HTTPS) requests (versions 3.{0,1,2,3}) using a regular expression // regex match // you can also proxy UNIX domain sockets (which should already exist when you call .addRule()): // you can also pass a matcher function: // 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: // start listening on port 3000 ;
Performance impact
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 connection | Reqs/s | I/O speed | Remarks |
---|---|---|---|
Direct | 9991 | 1863 KB/s | access HTTP server directly (not muxed) |
Muxed (TCP) | 4881 | 910 KB/s | HTTP server uses TCP sockets |
Muxed (UNIX) | 5629 | 1050 KB/s | HTTP server uses UNIX domain sockets |
So performance impact is about 50%, a bit less when you use UNIX domain sockets.
LICENSE
Simplified BSD License ( BSD-2-Clause ).