Engine.IO: the realtime engine
Engine.IO is the implementation of transport-based
cross-browser/cross-device bi-directional communication layer for
Socket.IO.
How to use
Server
(A) Listening on a port
var engine = require('engine.io');
var server = engine.listen(80);
server.on('connection', function(socket){
socket.send('utf 8 string');
socket.send(Buffer.from([0, 1, 2, 3, 4, 5])); // binary data
});
(B) Intercepting requests for a http.Server
var engine = require('engine.io');
var http = require('http').createServer().listen(3000);
var server = engine.attach(http);
server.on('connection', function (socket) {
socket.on('message', function(data){ });
socket.on('close', function(){ });
});
(C) Passing in requests
var engine = require('engine.io');
var server = new engine.Server();
server.on('connection', function(socket){
socket.send('hi');
});
// …
httpServer.on('upgrade', function(req, socket, head){
server.handleUpgrade(req, socket, head);
});
httpServer.on('request', function(req, res){
server.handleRequest(req, res);
});
Client
<script src="/path/to/engine.io.js"></script>
<script>
var socket = new eio.Socket('ws://localhost/');
socket.on('open', function(){
socket.on('message', function(data){});
socket.on('close', function(){});
});
</script>
For more information on the client refer to the
engine-client repository.
What features does it have?
- Maximum reliability. Connections are established even in the presence of:
- proxies and load balancers.
- personal firewall and antivirus software.
- for more information refer to Goals and Architecture sections
- Minimal client size aided by:
- lazy loading of flash transports.
- lack of redundant transports.
- Scalable
- load balancer friendly
- Future proof
- 100% Node.JS core style
- No API sugar (left for higher level projects)
- Written in readable vanilla JavaScript
API
Server
Top-level
These are exposed by require('engine.io'):
Events
flush- Called when a socket buffer is being flushed.
- Arguments
Socket: socket being flushedArray: write buffer
drain- Called when a socket buffer is drained
- Arguments
Socket: socket being flushed
Properties
protocol(Number): protocol revision numberServer: Server class constructorSocket: Socket class constructorTransport(Function): transport constructortransports(Object): map of available transports
Methods
-
()- Returns a new
Serverinstance. If the first argument is anhttp.Serverthen the
newServerinstance will be attached to it. Otherwise, the arguments are passed
directly to theServerconstructor. - Parameters
http.Server: optional, server to attach to.Object: optional, options object (seeServer#constructorapi docs below)
The following are identical ways to instantiate a server and then attach it.
- Returns a new
var httpServer; // previously created with `http.createServer();` from node.js api.
// create a server first, and then attach
var eioServer = require('engine.io').Server();
eioServer.attach(httpServer);
// or call the module as a function to get `Server`
var eioServer = require('engine.io')();
eioServer.attach(httpServer);
// immediately attach
var eioServer = require('engine.io')(httpServer);
// with custom options
var eioServer = require('engine.io')(httpServer, {
maxHttpBufferSize: 1e3
});
listen- Creates an
http.Serverwhich listens on the given port and attaches WS
to it. It returns501 Not Implementedfor regular http requests. - Parameters
Number: port to listen on.Object: optional, options objectFunction: callback forlisten.
- Options
- All options from
Server.attachmethod, documented below. - Additionally See Server
constructorbelow for options you can pass for creating the new Server
- All options from
- Returns
Server
- Creates an
var engine = require('engine.io');
var server = engine.listen(3000, {
pingTimeout: 2000,
pingInterval: 10000
});
server.on('connection', /* ... */);
attach- Captures
upgraderequests for ahttp.Server. In other words, makes
a regular http.Server WebSocket-compatible. - Parameters
http.Server: server to attach to.Object: optional, options object
- Options
- All options from
Server.attachmethod, documented below. - Additionally See Server
constructorbelow for options you can pass for creating the new Server
- All options from
- Returns
Servera new Server instance.
- Captures
var engine = require('engine.io');
var httpServer = require('http').createServer().listen(3000);
var server = engine.attach(httpServer, {
wsEngine: 'uws' // requires having uws as dependency
});
server.on('connection', /* ... */);
Server
The main server/manager. Inherits from EventEmitter.
Events
connection- Fired when a new connection is established.
- Arguments
Socket: a Socket object
Properties
Important: if you plan to use Engine.IO in a scalable way, please
keep in mind the properties below will only reflect the clients connected
to a single process.
clients(Object): hash of connected clients by id.clientsCount(Number): number of connected clients.
Methods
- constructor
- Initializes the server
- Parameters
Object: optional, options object
- Options
pingTimeout(Number): how many ms without a pong packet to
consider the connection closed (5000)pingInterval(Number): how many ms before sending a new ping
packet (25000)upgradeTimeout(Number): how many ms before an uncompleted transport upgrade is cancelled (10000)maxHttpBufferSize(Number): how many bytes or characters a message
can be, before closing the session (to avoid DoS). Default
value is10E7.allowRequest(Function): A function that receives a given handshake
or upgrade request as its first parameter, and can decide whether to
continue or not. The second argument is a function that needs to be
called with the decided information:fn(err, success), where
successis a boolean value where false means that the request is
rejected, and err is an error code.transports(<Array> String): transports to allow connections
to (['polling', 'websocket'])allowUpgrades(Boolean): whether to allow transport upgrades
(true)perMessageDeflate(`Object