Blazing fast low level http server
Switch branches/tags
Nothing to show
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
benchmarks 🤓 Some benchmarks. (#22) May 28, 2018
lib Add tests (#16) Mar 23, 2018
test Add tests (#16) Mar 23, 2018
.gitignore first commit Mar 1, 2018
.npmignore 🤓 Some benchmarks. (#22) May 28, 2018
.travis.yml add travis Mar 11, 2018
LICENSE first commit Mar 1, 2018
README.md 🤓 Some benchmarks. (#22) May 28, 2018
example.js utf-8 is default in Buffer.from Mar 6, 2018
http-status.js much cleaner api Mar 2, 2018
index.js extract req,res,server to lib/ (#14) Mar 18, 2018
package.json 🤓 Some benchmarks. (#22) May 28, 2018

README.md

turbo-http

A low level http library for Node.js based on turbo-net

npm i turbo-http

build status

WIP, this module is already really fast but there are some HTTP features missing and easy performance gains to be had. :D :D :D

On my laptop I can serve simple hello world payloads at around 100k requests/seconds compared to 10k requests/second using node core.

Usage

const turbo = require('turbo-http')

const server = turbo.createServer(function (req, res) {
  res.setHeader('Content-Length', '11')
  res.write(Buffer.from('hello world'))
})

server.listen(8080)

API

server = turbo.createServer([onrequest])

Create a new http server. Inherits from the turbo-net tcp server

server.on('request', req, res)

Emitted when a new http request is received.

res.statusCode = code

Set the http status

res.setHeader(name, value)

Set a http header

res.write(buf, [length], [callback])

Write a buffer. When the callback is called, the buffer has been completely flushed to the underlying socket and is safe to reuse for other purposes

res.writev(buffers, [lengths], [callback])

Write more that one buffer at once.

res.end([buf], [length], [callback])

End the request. Only needed if you do not provide a Content-Length.

req.url

Request url

req.method

Request method

req.socket

Request turbo-net socket

value = req.getHeader(name)

Get a request header.

headers = req.getAllHeaders()

Get all request headers as a map.

req.ondata(buffer, start, length)

Called when there is data read. If you use the buffer outside of this function you should copy it.

req.onend()

Called when the request is fully read.

Benchmarks

Comparing turbo-http to other frameworks is like comparing oranges to apples. turbo-http could be thought of as a replacement of Node's native http module, while all available frameworks actually use it.

Benchmark it:

  • clone this repo,
  • npm i
  • npm run bench

Benchmark averages are taken after one warm-up round.

  Requests/s Latency Throughput/Mb
turbo-http.js 32592 3.03 2.43
bare-node.js 18396 5.32 1.98
rayo.js 16249.6 6.03 1.77
polka.js 15802.4 6.2 1.71
fastify.js 15141.6 6.47 2.26
express.js 13408.8 7.31 1.46
hapi.js 9675.6 10.15 1.42

Note: Nevermind these numbers, this benchmark was run on a slow computer and the above table is for illustrative purposes only.

Optionally, you may also define your test's parameters:

$> npm run bench -- -u http://localhost:5050 -c 100 -p 10 -d 5
  • -u (url) -Defaults to http://localhost:5050
  • -c (connections) -Defaults to 100
  • -p (pipelines) -Defaults to 10
  • -d (duration) -Defaults to 5 (seconds)

Acknowledgements

This project was kindly sponsored by nearForm.

License

MIT