425 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			425 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
 | |
| # socket.io
 | |
| 
 | |
| [](https://travis-ci.org/socketio/socket.io)
 | |
| 
 | |
| 
 | |
| [](http://slack.socket.io)
 | |
| 
 | |
| ## How to use
 | |
| 
 | |
| The following example attaches socket.io to a plain Node.JS
 | |
| HTTP server listening on port `3000`.
 | |
| 
 | |
| ```js
 | |
| var server = require('http').createServer();
 | |
| var io = require('socket.io')(server);
 | |
| io.on('connection', function(socket){
 | |
|   socket.on('event', function(data){});
 | |
|   socket.on('disconnect', function(){});
 | |
| });
 | |
| server.listen(3000);
 | |
| ```
 | |
| 
 | |
| ### Standalone
 | |
| 
 | |
| ```js
 | |
| var io = require('socket.io')();
 | |
| io.on('connection', function(socket){});
 | |
| io.listen(3000);
 | |
| ```
 | |
| 
 | |
| ### In conjunction with Express
 | |
| 
 | |
| Starting with **3.0**, express applications have become request handler
 | |
| functions that you pass to `http` or `http` `Server` instances. You need
 | |
| to pass the `Server` to `socket.io`, and not the express application
 | |
| function.
 | |
| 
 | |
| ```js
 | |
| var app = require('express')();
 | |
| var server = require('http').createServer(app);
 | |
| var io = require('socket.io')(server);
 | |
| io.on('connection', function(){ /* … */ });
 | |
| server.listen(3000);
 | |
| ```
 | |
| 
 | |
| ### In conjunction with Koa
 | |
| 
 | |
| Like Express.JS, Koa works by exposing an application as a request
 | |
| handler function, but only by calling the `callback` method.
 | |
| 
 | |
| ```js
 | |
| var app = require('koa')();
 | |
| var server = require('http').createServer(app.callback());
 | |
| var io = require('socket.io')(server);
 | |
| io.on('connection', function(){ /* … */ });
 | |
| server.listen(3000);
 | |
| ```
 | |
| 
 | |
| ## API
 | |
| 
 | |
| ### Server
 | |
| 
 | |
|   Exposed by `require('socket.io')`.
 | |
| 
 | |
| ### Server()
 | |
| 
 | |
|   Creates a new `Server`. Works with and without `new`:
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   // or
 | |
|   var Server = require('socket.io');
 | |
|   var io = new Server();
 | |
|   ```
 | |
| 
 | |
| ### Server(opts:Object)
 | |
| 
 | |
|   Optionally, the first or second argument (see below) of the `Server`
 | |
|   constructor can be an options object.
 | |
| 
 | |
|   The following options are supported:
 | |
| 
 | |
|   - `serveClient` sets the value for Server#serveClient()
 | |
|   - `path` sets the value for Server#path()
 | |
| 
 | |
|   The same options passed to socket.io are always passed to
 | |
|   the `engine.io` `Server` that gets created. See engine.io
 | |
|   [options](https://github.com/socketio/engine.io#methods-1)
 | |
|   as reference.
 | |
| 
 | |
| ### Server(srv:http#Server, opts:Object)
 | |
| 
 | |
|   Creates a new `Server` and attaches it to the given `srv`. Optionally
 | |
|   `opts` can be passed.
 | |
| 
 | |
| ### Server(port:Number, opts:Object)
 | |
| 
 | |
|   Binds socket.io to a new `http.Server` that listens on `port`.
 | |
| 
 | |
| ### Server#serveClient(v:Boolean):Server
 | |
| 
 | |
|   If `v` is `true` the attached server (see `Server#attach`) will serve
 | |
|   the client files. Defaults to `true`.
 | |
| 
 | |
|   This method has no effect after `attach` is called.
 | |
| 
 | |
|   ```js
 | |
|   // pass a server and the `serveClient` option
 | |
|   var io = require('socket.io')(http, { serveClient: false });
 | |
| 
 | |
|   // or pass no server and then you can call the method
 | |
|   var io = require('socket.io')();
 | |
|   io.serveClient(false);
 | |
|   io.attach(http);
 | |
|   ```
 | |
| 
 | |
|   If no arguments are supplied this method returns the current value.
 | |
| 
 | |
| ### Server#path(v:String):Server
 | |
| 
 | |
|   Sets the path `v` under which `engine.io` and the static files will be
 | |
|   served. Defaults to `/socket.io`.
 | |
| 
 | |
|   If no arguments are supplied this method returns the current value.
 | |
| 
 | |
| ### Server#adapter(v:Adapter):Server
 | |
| 
 | |
|   Sets the adapter `v`. Defaults to an instance of the `Adapter` that
 | |
|   ships with socket.io which is memory based. See
 | |
|   [socket.io-adapter](https://github.com/socketio/socket.io-adapter).
 | |
| 
 | |
|   If no arguments are supplied this method returns the current value.
 | |
| 
 | |
| ### Server#origins(v:String):Server
 | |
| 
 | |
|   Sets the allowed origins `v`. Defaults to any origins being allowed.
 | |
| 
 | |
|   If no arguments are supplied this method returns the current value.
 | |
| 
 | |
| ### Server#origins(v:Function):Server
 | |
| 
 | |
|   Sets the allowed origins as dynamic function. Function takes two arguments `origin:String` and `callback(error, success)`, where `success` is a boolean value indicating whether origin is allowed or not.
 | |
| 
 | |
|   __Potential drawbacks__:
 | |
|   * in some situations, when it is not possible to determine `origin` it may have value of `*`
 | |
|   * As this function will be executed for every request, it is advised to make this function work as fast as possible
 | |
|   * If `socket.io` is used together with `Express`, the CORS headers will be affected only for `socket.io` requests. For Express can use [cors](https://github.com/expressjs/cors)
 | |
| 
 | |
| 
 | |
| ### Server#sockets:Namespace
 | |
| 
 | |
|   The default (`/`) namespace.
 | |
| 
 | |
| ### Server#attach(srv:http#Server, opts:Object):Server
 | |
| 
 | |
|   Attaches the `Server` to an engine.io instance on `srv` with the
 | |
|   supplied `opts` (optionally).
 | |
| 
 | |
| ### Server#attach(port:Number, opts:Object):Server
 | |
| 
 | |
|   Attaches the `Server` to an engine.io instance that is bound to `port`
 | |
|   with the given `opts` (optionally).
 | |
| 
 | |
| ### Server#listen
 | |
| 
 | |
|   Synonym of `Server#attach`.
 | |
| 
 | |
| ### Server#bind(srv:engine#Server):Server
 | |
| 
 | |
|   Advanced use only. Binds the server to a specific engine.io `Server`
 | |
|   (or compatible API) instance.
 | |
| 
 | |
| ### Server#onconnection(socket:engine#Socket):Server
 | |
| 
 | |
|   Advanced use only. Creates a new `socket.io` client from the incoming
 | |
|   engine.io (or compatible API) `socket`.
 | |
| 
 | |
| ### Server#of(nsp:String):Namespace
 | |
| 
 | |
|   Initializes and retrieves the given `Namespace` by its pathname
 | |
|   identifier `nsp`.
 | |
| 
 | |
|   If the namespace was already initialized it returns it right away.
 | |
| 
 | |
| ### Server#emit
 | |
| 
 | |
|   Emits an event to all connected clients. The following two are
 | |
|   equivalent:
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.sockets.emit('an event sent to all connected clients');
 | |
|   io.emit('an event sent to all connected clients');
 | |
|   ```
 | |
| 
 | |
|   For other available methods, see `Namespace` below.
 | |
| 
 | |
| ### Server#close
 | |
| 
 | |
|   Closes socket server
 | |
| 
 | |
|   ```js
 | |
|   var Server = require('socket.io');
 | |
|   var PORT   = 3030;
 | |
|   var server = require('http').Server();
 | |
| 
 | |
|   var io = Server(PORT);
 | |
| 
 | |
|   io.close(); // Close current server
 | |
| 
 | |
|   server.listen(PORT); // PORT is free to use
 | |
| 
 | |
|   io = Server(server);
 | |
|   ```
 | |
| 
 | |
| ### Server#use
 | |
| 
 | |
|   See `Namespace#use` below.
 | |
| 
 | |
| ### Namespace
 | |
| 
 | |
|   Represents a pool of sockets connected under a given scope identified
 | |
|   by a pathname (eg: `/chat`).
 | |
| 
 | |
|   By default the client always connects to `/`.
 | |
| 
 | |
| #### Events
 | |
| 
 | |
|   - `connection` / `connect`. Fired upon a connection.
 | |
| 
 | |
|     Parameters:
 | |
|     - `Socket` the incoming socket.
 | |
| 
 | |
| ### Namespace#name:String
 | |
| 
 | |
|   The namespace identifier property.
 | |
| 
 | |
| ### Namespace#connected:Object<Socket>
 | |
| 
 | |
|   Hash of `Socket` objects that are connected to this namespace indexed
 | |
|   by `id`.
 | |
| 
 | |
| ### Namespace#clients(fn:Function)
 | |
| 
 | |
|   Gets a list of client IDs connected to this namespace (across all nodes if applicable).
 | |
| 
 | |
|   An example to get all clients in a namespace:
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.of('/chat').clients(function(error, clients){
 | |
|     if (error) throw error;
 | |
|     console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD]
 | |
|   });
 | |
|   ```
 | |
| 
 | |
|   An example to get all clients in namespace's room:
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.of('/chat').in('general').clients(function(error, clients){
 | |
|     if (error) throw error;
 | |
|     console.log(clients); // => [Anw2LatarvGVVXEIAAAD]
 | |
|   });
 | |
|   ```
 | |
| 
 | |
|   As with broadcasting, the default is all clients from the default namespace ('/'):
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.clients(function(error, clients){
 | |
|     if (error) throw error;
 | |
|     console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB]
 | |
|   });
 | |
|   ```
 | |
| 
 | |
| ### Namespace#use(fn:Function):Namespace
 | |
| 
 | |
|   Registers a middleware, which is a function that gets executed for
 | |
|   every incoming `Socket` and receives as parameter the socket and a
 | |
|   function to optionally defer execution to the next registered
 | |
|   middleware.
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.use(function(socket, next){
 | |
|     if (socket.request.headers.cookie) return next();
 | |
|     next(new Error('Authentication error'));
 | |
|   });
 | |
|   ```
 | |
| 
 | |
|   Errors passed to middleware callbacks are sent as special `error`
 | |
|   packets to clients.
 | |
| 
 | |
| ### Socket
 | |
| 
 | |
|   A `Socket` is the fundamental class for interacting with browser
 | |
|   clients. A `Socket` belongs to a certain `Namespace` (by default `/`)
 | |
|   and uses an underlying `Client` to communicate.
 | |
| 
 | |
| ### Socket#rooms:Array
 | |
| 
 | |
|   A list of strings identifying the rooms this socket is in.
 | |
| 
 | |
| ### Socket#client:Client
 | |
| 
 | |
|   A reference to the underlying `Client` object.
 | |
| 
 | |
| ### Socket#conn:Socket
 | |
| 
 | |
|   A reference to the underlying `Client` transport connection (engine.io
 | |
|   `Socket` object).
 | |
| 
 | |
| ### Socket#request:Request
 | |
| 
 | |
|   A getter proxy that returns the reference to the `request` that
 | |
|   originated the underlying engine.io `Client`. Useful for accessing
 | |
|   request headers such as `Cookie` or `User-Agent`.
 | |
| 
 | |
| ### Socket#id:String
 | |
| 
 | |
|   A unique identifier for the socket session, that comes from the
 | |
|   underlying `Client`.
 | |
| 
 | |
| ### Socket#emit(name:String[, …]):Socket
 | |
| 
 | |
|   Emits an event to the socket identified by the string `name`. Any
 | |
|   other parameters can be included.
 | |
| 
 | |
|   All datastructures are supported, including `Buffer`. JavaScript
 | |
|   functions can't be serialized/deserialized.
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.on('connection', function(socket){
 | |
|     socket.emit('an event', { some: 'data' });
 | |
|   });
 | |
|   ```
 | |
| 
 | |
| ### Socket#join(name:String[, fn:Function]):Socket
 | |
| 
 | |
|   Adds the socket to the `room`, and fires optionally a callback `fn`
 | |
|   with `err` signature (if any).
 | |
| 
 | |
|   The socket is automatically a member of a room identified with its
 | |
|   session id (see `Socket#id`).
 | |
| 
 | |
|   The mechanics of joining  rooms are handled by the `Adapter`
 | |
|   that has been configured (see `Server#adapter` above), defaulting to
 | |
|   [socket.io-adapter](https://github.com/socketio/socket.io-adapter).
 | |
| 
 | |
| ### Socket#leave(name:String[, fn:Function]):Socket
 | |
| 
 | |
|   Removes the socket from `room`, and fires optionally a callback `fn`
 | |
|   with `err` signature (if any).
 | |
| 
 | |
|   **Rooms are left automatically upon disconnection**.
 | |
| 
 | |
|   The mechanics of leaving rooms are handled by the `Adapter`
 | |
|   that has been configured (see `Server#adapter` above), defaulting to
 | |
|   [socket.io-adapter](https://github.com/socketio/socket.io-adapter).
 | |
| 
 | |
| ### Socket#to(room:String):Socket
 | |
| 
 | |
|   Sets a modifier for a subsequent event emission that the event will
 | |
|   only be _broadcasted_ to sockets that have joined the given `room`.
 | |
| 
 | |
|   To emit to multiple rooms, you can call `to` several times.
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.on('connection', function(socket){
 | |
|     socket.to('others').emit('an event', { some: 'data' });
 | |
|   });
 | |
|   ```
 | |
| 
 | |
| ### Socket#in(room:String):Socket
 | |
| 
 | |
|   Same as `Socket#to`
 | |
| 
 | |
| ### Socket#compress(v:Boolean):Socket
 | |
| 
 | |
|   Sets a modifier for a subsequent event emission that the event data will
 | |
|   only be _compressed_ if the value is `true`. Defaults to `true` when you don't call the method.
 | |
| 
 | |
|   ```js
 | |
|   var io = require('socket.io')();
 | |
|   io.on('connection', function(socket){
 | |
|     socket.compress(false).emit('an event', { some: 'data' });
 | |
|   });
 | |
|   ```
 | |
| 
 | |
| ### Client
 | |
| 
 | |
|   The `Client` class represents an incoming transport (engine.io)
 | |
|   connection. A `Client` can be associated with many multiplexed `Socket`
 | |
|   that belong to different `Namespace`s.
 | |
| 
 | |
| ### Client#conn
 | |
| 
 | |
|   A reference to the underlying `engine.io` `Socket` connection.
 | |
| 
 | |
| ### Client#request
 | |
| 
 | |
|   A getter proxy that returns the reference to the `request` that
 | |
|   originated the engine.io connection. Useful for accessing
 | |
|   request headers such as `Cookie` or `User-Agent`.
 | |
| 
 | |
| ## Debug / logging
 | |
| 
 | |
| Socket.IO is powered by [debug](https://github.com/visionmedia/debug).
 | |
| In order to see all the debug output, run your app with the environment variable
 | |
| `DEBUG` including the desired scope.
 | |
| 
 | |
| To see the output from all of Socket.IO's debugging scopes you can use:
 | |
| 
 | |
| ```
 | |
| DEBUG=socket.io* node myapp
 | |
| ```
 | |
| 
 | |
| ## License
 | |
| 
 | |
| MIT
 |