Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

0http

Package Overview
Dependencies
Maintainers
1
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

0http

Cero friction HTTP request router. The need for speed!

  • 2.2.1
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
3.9K
decreased by-13.43%
Maintainers
1
Weekly downloads
 
Created
Source

0http

Cero friction HTTP framework:

  • Tweaked Node.js Server for high throughput.
  • Use the request router you like.

Usage

const cero = require('0http')
const { router, server } = cero()

router.get('/hello', (req, res) => {
  res.end('Hello World!')
})

router.post('/do', (req, res) => {
  // ...
  res.statusCode = 201
  res.end()
})

//...

server.listen(3000)

Routers

0http allows you to define the router implementation you prefer as soon as it support the following interface:

router.lookup = (req, res) // -> should trigger router search and handlers execution

0http - sequential (default router)

This a 0http extended implementation of the trouter router. Includes support for middlewares, nested routers and shortcuts for routes registration.
As this is an iterative regular expression matching router, it tends to be slower than find-my-way when the number of registered routes increases; to mitigate this issue, we use an internal LRU cache to store the matching results of the previous requests, resulting on a super-fast matching process.

Supported HTTP verbs: GET, HEAD, PATCH, OPTIONS, CONNECT, DELETE, TRACE, POST, PUT

const cero = require('0http')
const { router, server } = cero({})

// global middleware example
router.use('/', (req, res, next) => {
  res.write('Hello ')
  next()
})

// route middleware example
const routeMiddleware = (req, res, next) => {
  res.write('World')
  next()
}

// GET /sayhi route with middleware and handler
router.get('/sayhi', routeMiddleware, (req, res) => {
  res.end('!')
})

server.listen(3000)
Configuration Options
  • defaultRoute: Route handler when there is no router matching. Default value:
    (req, res) => {
      res.statusCode = 404
      res.end()
    }
    
  • cacheSize: Router matching LRU cache size. Default value: 1000
  • errorHandler: Global error handler function. Default value:
    (err, req, res) => {
      res.statusCode = 500
      res.end(err.message)
    }
    

Example passing configuration options:

const sequential = require('0http/lib/router/sequential')
const { router, server } = cero({
  router: sequential({
    cacheSize: 2000
  })
})
Async middlewares

You can use async middlewares to await the remaining chain execution. Let's describe with a custom error handler middleware:

router.use('/', async (req, res, next) => {
  try {
    await next()
  } catch (err) {
    res.statusCode = 500
    res.end(err.message)
  }
})

router.get('/sayhi', (req, res) => {
  throw new Error('Uuuups!')
})
Nested Routers

You can simply use sequential router intances as nested routers:

const cero = require('../index')
const { router, server } = cero({})

const nested = require('0http/lib/router/sequential')()
nested.get('/url', (req, res, next) => {
  res.end(req.url)      
})
router.use('/v1', nested)

server.listen(3000)

find-my-way router

https://github.com/delvedor/find-my-way

Super-fast raw HTTP router with no goodies. Internally uses a Radix Tree router that will bring better performance over iterative regular expressions matching.

const cero = require('../index')
const { router, server } = cero({
  router: require('find-my-way')()
})

router.on('GET', '/hi', (req, res) => {
  res.end('Hello World!')
})

server.listen(3000)

Servers

0http is just a wrapper for the servers and routers implementations you provide.

const cero = require('0http')

const { router, server } = cero({
  server: yourCustomServerInstance
})

Node.js http.Server

If no server is provided by configuration, the standard Node.js http.Server implementation is used.
Because this server offers the best balance between Node.js ecosystem compatibility and performance, we highly recommend it for most use cases.

Low Server

low is a tiny Node.js friendly wrapper around the great uWebSockets.js HTTP server. I/O throughput is maximized at the cost of API compatibility.

As far as for Node.js, uWebSockets.js brings the best I/O performance in terms of HTTP support.

Install dependencies
npm i uNetworking/uWebSockets.js#v15.11.0
Example usage
const low = require('0http/lib/server/low')
const cero = require('0http')

const { router, server } = cero({
  server: low()
})

router.get('/hi', (req, res) => {
  res.end('Hello World!')
})

server.listen(3000, (socket) => {
  if (socket) {
    console.log('HTTP server ready!')
  }
})


// ...
server.close()

Benchmarks (30/12/2019)

Node version: v12.14.0
Laptop: MacBook Pro 2019, 2,4 GHz Intel Core i9, 32 GB 2400 MHz DDR4
Server: Single instance

wrk -t8 -c40 -d5s http://127.0.0.1:3000/hi

1 route registered

  • 0http (find-my-way + low)
    Requests/sec: 135436.99
  • 0http (sequential + low)
    Requests/sec: 134281.32
  • 0http (sequential)
    Requests/sec: 88438.69
  • 0http (find-my-way)
    Requests/sec: 87597.44
  • restana v3.4.2
    Requests/sec: 73455.97

5 routes registered

  • 0http (sequential)
    Requests/sec: 85839.17
  • 0http (find-my-way)
    Requests/sec: 82682.86

For more accurate benchmarks please see:

Keywords

FAQs

Package last updated on 03 Jan 2020

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc