206

GitHub - uNetworking/uWebSockets.js: TypeScript web server - 15x faster than Den...

 5 years ago
source link: https://github.com/uNetworking/uWebSockets.js
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md

logo.svg?sanitize=true

µWebSockets™ (it's "micro") is simple, secure & standards compliant web I/O for the most demanding[1]of applications.

TypeScript docsRead more & user manual (C++ project)

Outrun. Everyone.

This project is not your typical "web framework" à la 500 lines of JavaScript and a fancy logo. No, you're looking at a three part software suite of ~7k lines of C & C++, working in unison with Google V8 to bring you one of the most memory scalable and performant I/O scriping environment available.

It runs 15x faster than Deno and scales to millions of connections using less than half a GB of user space memory.

Read the release post and/or the 1 million WebSockets post.

No compiler needed.

We use AppVeyor & TravisCI to automatically pre-compile binaries for Linux, macOS and Windows with every push. New releases are tagged from branch binaries and can be installed using NPM like so:

npm install uNetworking/uWebSockets.js#v15.2.0

where v15.2.0 is the particular Git tag you wanted to use.

In a nutshell

There are tons of examples but here's the gist of it all:

const uWS = require('../dist/uws.js');
const port = 9001;

const app = uWS.SSLApp({
  key_file_name: 'misc/key.pem',
  cert_file_name: 'misc/cert.pem',
  passphrase: '1234'
}).ws('/*', {
  /* Options */
  compression: 0,
  maxPayloadLength: 16 * 1024 * 1024,
  idleTimeout: 10,
  /* Handlers */
  open: (ws, req) => {
    console.log('A WebSocket connected via URL: ' + req.getUrl() + '!');
  },
  message: (ws, message, isBinary) => {
    /* Ok is false if backpressure was built up, wait for drain */
    let ok = ws.send(message, isBinary);
  },
  drain: (ws) => {
    console.log('WebSocket backpressure: ' + ws.getBufferedAmount());
  },
  close: (ws, code, message) => {
    console.log('WebSocket closed');
  }
}).any('/*', (res, req) => {
  res.end('Nothing to see here!');
}).listen(port, (token) => {
  if (token) {
    console.log('Listening to port ' + port);
  } else {
    console.log('Failed to listen to port ' + port);
  }
});

Streams

Proper streaming of huge data is supported over Http/Https and demonstrated with examples. Here's a shot of me watching real-time streamed HD video from Node.js while simultaneously scoring a 115k req/sec with wrk. For my computer, that's about 5x that of vanilla Node.js (without any HD video streaming/playing).

Pub/sub

WIP section --

Benchmarks

In the following charts "µWS v0.15" denote the C++ project - performance retention for µWebSockets.js inside of V8 is about 65-75%, similar to or above the top performing Golang modules. User space memory usage for a million WebSockets is in the 100-400mb range.

Http WebSockets PubSub todo: Socket.IO, SocketCluster, ClusterWS

Build from source

Recursively clone, and enter, this repo:

git clone --recursive https://github.com/uNetworking/uWebSockets.js.git
cd uWebSockets.js

For Unix (Linux, macOS, FreeBSD):

make

For Windows (in an x64 developer terminal):

nmake Windows

Test it out

node examples/HelloWorld.js

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK