hyperprox

2.3.1 • Public • Published

hyperprox

simple HTTP proxy based on hyperquest

install

$ npm install hyperprox

usage

Create a proxy by passing a function that will resolve what backend to use to the given request

var http = require("http")
var hyperprox = require('hyperprox')

var backends = hyperprox(function(req){
  // calculate the proxy destination
  var port = req.url=='/a' ? 8081 : 8082
  return 'http://127.0.0.1:' + port
})

// the front facing web server
var router = http.createServer(backends.handler())

backends.on('request', function(req, res){
	
})

backends.on('route', function(req, address){
	
})

var serverA = http.createServer(function(req, res){
  res.end('serverA')
})

var serverB = http.createServer(function(req, res){
  res.end('serverB')
})

router.listen(8080)
serverA.listen(8081)
serverB.listen(8082)

streams

We can generate a duplex stream for a request that will auto-route - this lets us filter the input and output:

var through = require('through2')
var backends = hyperprox(function(req){
  var port = req.url=='/a' ? 8081 : 8082
  return 'http://127.0.0.1:' + port
})

var router = http.createServer(function(req, res){
	var proxy = backends.duplex(req, res)

	// filter the request body
	var inputFilter = through(function(chunk, enc, next){
		this.push(chunk.toString() + 'a')
		next()
	})

	// filter the response body
	var outputFilter = through(function(chunk, enc, next){
		this.push(chunk.toUpperCase())
		next()
	})

	// REQUEST -> INPUT FILTER -> PROXY -> OUTPUT FILTER -> RESPONSE
	req.pipe(inputFilter).pipe(proxy).pipe(outputFilter).pipe(res)
})

async routing

Your routing function can be asynchronous - this means you can ask an external service for routing data:

If you define next in the parameters then it will be treated as an async router.

var proxy = hyperprox(function(req, next){

	loadRoute(req.url, function(err, address){
		next(err, address)
	})
	
})

api

hyperprox.proxy(req, res, address, [input, output])

A direct proxy function that will send req via address to res

Input and output are optional override streams to replace req and res

var backends = hyperprox(function(req, next){})

Create a new proxy by passing a function that will resolve the backend address and pass it to the 'next' function

backends.handler()

Return a function(req,res){} that will proxy requests using the routing function

backends.proxy(req, res, address, [input, output])

A direct proxy that will pipe req via address and to res

If input and output are provided - they will be used as the streams rather than req and res

backends.resolve(req, done)

The resolving function that goes via the user supplied function

backends.duplex(req, res)

Return a duplex stream going through the backend - you can write it to the original request / response how you want:

var duplex = backends.duplex(req, res)
req.pipe(duplex).pipe(res)

If there is an error with routing the response will be set to 500 and the backend skipped

events

backends.on('request', function(req, res){})

when a request arrives at the proxy

backends.on('route', function(req, address){})

Once a routing decision has been made

license

MIT

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 2.3.1
    1,003
    • latest

Version History

Package Sidebar

Install

npm i hyperprox

Weekly Downloads

819

Version

2.3.1

License

MIT

Last publish

Collaborators

  • binocarlos