hackcentercontrol/nodeartnet/node_modules/socket.io/lib/index.js

132 lines
2.5 KiB
JavaScript

/**
* Module dependencies.
*/
var http = require('http')
, engine = require('engine.io')
, Client = require('./client')
, Namespace = require('./namespace')
, debug = require('debug')('socket.io:server');
/**
* Read client
*/
var client = {
source: require('socket.io-client').source,
version: require('socket.io-client/package').version
};
/**
* Server constructor.
*
* @param {http.Server|Number|Object} http server, port or options
* @param {Object} options
* @api public
*/
function Server(srv, opts){
if (!(this instanceof Server)) return new Server(srv, opts);
if ('object' == typeof srv && !srv.listen) {
opts = srv;
srv = null;
}
opts = opts || {};
if (srv) this.attach(srv, opts);
this.sockets = this.of('/');
this.client(true);
}
/**
* Serve client code.
*
* @api public
*/
/**
* Attaches socket.io to a server or port.
*
* @param {http.Server|Number} server or port
* @param {Object} options
* @api public
*/
Server.prototype.attach = function(srv, opts){
if ('number' == typeof srv) {
debug('creating engine.io on port %d', srv);
srv = engine.listen(srv, opts);
} else {
debug('creating engine.io instance', opts);
srv = engine.attach(srv, opts);
}
this.bind(srv);
};
/**
* Binds socket.io to an engine.io instance.
*
* @param {engine.Server} engine.io (or compatible) server
* @api public
*/
Server.prototype.bind = function(engine){
this.engine = engine;
this.engine.on('connection', this.onconnection.bind(this));
};
/**
* Called with each incoming transport connection.
*
* @api public
*/
Server.prototype.onconnection = function(conn){
debug('incoming connection with id %s', conn.id);
var client = new Client(this, conn);
client.connect('/');
this.emit('client', client);
};
/**
* Looks up a namespace.
*
* @param {String} nsp name
* @api public
*/
Server.prototype.of = function(name){
if (!this.nsps[name]) {
debug('initializing namespace %s', name);
var nsp = new Namespace(this, name);
this.nsps[name] = nsp;
}
return this.nsps[name];
};
/**
* Expose main namespace (/).
*/
['use', 'to', 'in', 'emit', 'send', 'write'].forEach(function(name){
Server.prototype[name] = function(){
var nsp = this.sockets[name];
return nsp.apply(this.sockets, arguments);
};
});
Namespace.flags.forEach(function(flag){
Server.prototype.__defineGetter__(flag, function(name){
this.flags.push(name);
return this;
});
});
/**
* BC with `io.listen`
*/
Server.listen = Server;