Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org »

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

install

npm i hyperprox

Downloadsweekly downloads

2

version

2.3.1

license

MIT

homepage

github.com

repository

Gitgithub

last publish

collaborators

  • avatar
Report a vulnerability