From dc46b87abee1e441c07524ddde67fd902a919336 Mon Sep 17 00:00:00 2001 From: Kumar Damani Date: Tue, 16 Apr 2019 09:17:06 -0400 Subject: added some dependencies to package.json --- node_modules/socket.io/lib/client.js | 251 ----------------- node_modules/socket.io/lib/index.js | 385 -------------------------- node_modules/socket.io/lib/namespace.js | 272 ------------------ node_modules/socket.io/lib/socket.js | 470 -------------------------------- 4 files changed, 1378 deletions(-) delete mode 100644 node_modules/socket.io/lib/client.js delete mode 100644 node_modules/socket.io/lib/index.js delete mode 100644 node_modules/socket.io/lib/namespace.js delete mode 100644 node_modules/socket.io/lib/socket.js (limited to 'node_modules/socket.io/lib') diff --git a/node_modules/socket.io/lib/client.js b/node_modules/socket.io/lib/client.js deleted file mode 100644 index 407d6c3..0000000 --- a/node_modules/socket.io/lib/client.js +++ /dev/null @@ -1,251 +0,0 @@ - -/** - * Module dependencies. - */ - -var parser = require('socket.io-parser'); -var debug = require('debug')('socket.io:client'); - -/** - * Module exports. - */ - -module.exports = Client; - -/** - * Client constructor. - * - * @param {Server} server instance - * @param {Socket} conn - * @api private - */ - -function Client(server, conn){ - this.server = server; - this.conn = conn; - this.encoder = new parser.Encoder(); - this.decoder = new parser.Decoder(); - this.id = conn.id; - this.request = conn.request; - this.setup(); - this.sockets = {}; - this.nsps = {}; - this.connectBuffer = []; -} - -/** - * Sets up event listeners. - * - * @api private - */ - -Client.prototype.setup = function(){ - this.onclose = this.onclose.bind(this); - this.ondata = this.ondata.bind(this); - this.onerror = this.onerror.bind(this); - this.ondecoded = this.ondecoded.bind(this); - - this.decoder.on('decoded', this.ondecoded); - this.conn.on('data', this.ondata); - this.conn.on('error', this.onerror); - this.conn.on('close', this.onclose); -}; - -/** - * Connects a client to a namespace. - * - * @param {String} name namespace - * @api private - */ - -Client.prototype.connect = function(name){ - debug('connecting to namespace %s', name); - var nsp = this.server.nsps[name]; - if (!nsp) { - this.packet({ type: parser.ERROR, nsp: name, data : 'Invalid namespace'}); - return; - } - - if ('/' != name && !this.nsps['/']) { - this.connectBuffer.push(name); - return; - } - - var self = this; - var socket = nsp.add(this, function(){ - self.sockets[socket.id] = socket; - self.nsps[nsp.name] = socket; - - if ('/' == nsp.name && self.connectBuffer.length > 0) { - self.connectBuffer.forEach(self.connect, self); - self.connectBuffer = []; - } - }); -}; - -/** - * Disconnects from all namespaces and closes transport. - * - * @api private - */ - -Client.prototype.disconnect = function(){ - for (var id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].disconnect(); - } - } - this.sockets = {}; - this.close(); -}; - -/** - * Removes a socket. Called by each `Socket`. - * - * @api private - */ - -Client.prototype.remove = function(socket){ - if (this.sockets.hasOwnProperty(socket.id)) { - var nsp = this.sockets[socket.id].nsp.name; - delete this.sockets[socket.id]; - delete this.nsps[nsp]; - } else { - debug('ignoring remove for %s', socket.id); - } -}; - -/** - * Closes the underlying connection. - * - * @api private - */ - -Client.prototype.close = function(){ - if ('open' == this.conn.readyState) { - debug('forcing transport close'); - this.conn.close(); - this.onclose('forced server close'); - } -}; - -/** - * Writes a packet to the transport. - * - * @param {Object} packet object - * @param {Object} opts - * @api private - */ - -Client.prototype.packet = function(packet, opts){ - opts = opts || {}; - var self = this; - - // this writes to the actual connection - function writeToEngine(encodedPackets) { - if (opts.volatile && !self.conn.transport.writable) return; - for (var i = 0; i < encodedPackets.length; i++) { - self.conn.write(encodedPackets[i], { compress: opts.compress }); - } - } - - if ('open' == this.conn.readyState) { - debug('writing packet %j', packet); - if (!opts.preEncoded) { // not broadcasting, need to encode - this.encoder.encode(packet, function (encodedPackets) { // encode, then write results to engine - writeToEngine(encodedPackets); - }); - } else { // a broadcast pre-encodes a packet - writeToEngine(packet); - } - } else { - debug('ignoring packet write %j', packet); - } -}; - -/** - * Called with incoming transport data. - * - * @api private - */ - -Client.prototype.ondata = function(data){ - // try/catch is needed for protocol violations (GH-1880) - try { - this.decoder.add(data); - } catch(e) { - this.onerror(e); - } -}; - -/** - * Called when parser fully decodes a packet. - * - * @api private - */ - -Client.prototype.ondecoded = function(packet) { - if (parser.CONNECT == packet.type) { - this.connect(packet.nsp); - } else { - var socket = this.nsps[packet.nsp]; - if (socket) { - socket.onpacket(packet); - } else { - debug('no socket for namespace %s', packet.nsp); - } - } -}; - -/** - * Handles an error. - * - * @param {Object} err object - * @api private - */ - -Client.prototype.onerror = function(err){ - for (var id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].onerror(err); - } - } - this.onclose('client error'); -}; - -/** - * Called upon transport close. - * - * @param {String} reason - * @api private - */ - -Client.prototype.onclose = function(reason){ - debug('client close with reason %s', reason); - - // ignore a potential subsequent `close` event - this.destroy(); - - // `nsps` and `sockets` are cleaned up seamlessly - for (var id in this.sockets) { - if (this.sockets.hasOwnProperty(id)) { - this.sockets[id].onclose(reason); - } - } - this.sockets = {}; - - this.decoder.destroy(); // clean up decoder -}; - -/** - * Cleans up event listeners. - * - * @api private - */ - -Client.prototype.destroy = function(){ - this.conn.removeListener('data', this.ondata); - this.conn.removeListener('error', this.onerror); - this.conn.removeListener('close', this.onclose); - this.decoder.removeListener('decoded', this.ondecoded); -}; diff --git a/node_modules/socket.io/lib/index.js b/node_modules/socket.io/lib/index.js deleted file mode 100644 index b35d1b1..0000000 --- a/node_modules/socket.io/lib/index.js +++ /dev/null @@ -1,385 +0,0 @@ - -/** - * Module dependencies. - */ - -var http = require('http'); -var read = require('fs').readFileSync; -var engine = require('engine.io'); -var client = require('socket.io-client'); -var clientVersion = require('socket.io-client/package').version; -var Client = require('./client'); -var Namespace = require('./namespace'); -var Adapter = require('socket.io-adapter'); -var debug = require('debug')('socket.io:server'); -var url = require('url'); - -/** - * Module exports. - */ - -module.exports = Server; - -/** - * Socket.IO client source. - */ - -var clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8'); - -/** - * Server constructor. - * - * @param {http.Server|Number|Object} srv http server, port or options - * @param {Object} opts - * @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 || {}; - this.nsps = {}; - this.path(opts.path || '/socket.io'); - this.serveClient(false !== opts.serveClient); - this.adapter(opts.adapter || Adapter); - this.origins(opts.origins || '*:*'); - this.sockets = this.of('/'); - if (srv) this.attach(srv, opts); -} - -/** - * Server request verification function, that checks for allowed origins - * - * @param {http.IncomingMessage} req request - * @param {Function} fn callback to be called with the result: `fn(err, success)` - */ - -Server.prototype.checkRequest = function(req, fn) { - var origin = req.headers.origin || req.headers.referer; - - // file:// URLs produce a null Origin which can't be authorized via echo-back - if ('null' == origin || null == origin) origin = '*'; - - if (!!origin && typeof(this._origins) == 'function') return this._origins(origin, fn); - if (this._origins.indexOf('*:*') !== -1) return fn(null, true); - if (origin) { - try { - var parts = url.parse(origin); - var defaultPort = 'https:' == parts.protocol ? 443 : 80; - parts.port = parts.port != null - ? parts.port - : defaultPort; - var ok = - ~this._origins.indexOf(parts.hostname + ':' + parts.port) || - ~this._origins.indexOf(parts.hostname + ':*') || - ~this._origins.indexOf('*:' + parts.port); - return fn(null, !!ok); - } catch (ex) { - } - } - fn(null, false); -}; - -/** - * Sets/gets whether client code is being served. - * - * @param {Boolean} v whether to serve client code - * @return {Server|Boolean} self when setting or value when getting - * @api public - */ - -Server.prototype.serveClient = function(v){ - if (!arguments.length) return this._serveClient; - this._serveClient = v; - return this; -}; - -/** - * Old settings for backwards compatibility - */ - -var oldSettings = { - "transports": "transports", - "heartbeat timeout": "pingTimeout", - "heartbeat interval": "pingInterval", - "destroy buffer size": "maxHttpBufferSize" -}; - -/** - * Backwards compatiblity. - * - * @api public - */ - -Server.prototype.set = function(key, val){ - if ('authorization' == key && val) { - this.use(function(socket, next) { - val(socket.request, function(err, authorized) { - if (err) return next(new Error(err)); - if (!authorized) return next(new Error('Not authorized')); - next(); - }); - }); - } else if ('origins' == key && val) { - this.origins(val); - } else if ('resource' == key) { - this.path(val); - } else if (oldSettings[key] && this.eio[oldSettings[key]]) { - this.eio[oldSettings[key]] = val; - } else { - console.error('Option %s is not valid. Please refer to the README.', key); - } - - return this; -}; - -/** - * Sets the client serving path. - * - * @param {String} v pathname - * @return {Server|String} self when setting or value when getting - * @api public - */ - -Server.prototype.path = function(v){ - if (!arguments.length) return this._path; - this._path = v.replace(/\/$/, ''); - return this; -}; - -/** - * Sets the adapter for rooms. - * - * @param {Adapter} v pathname - * @return {Server|Adapter} self when setting or value when getting - * @api public - */ - -Server.prototype.adapter = function(v){ - if (!arguments.length) return this._adapter; - this._adapter = v; - for (var i in this.nsps) { - if (this.nsps.hasOwnProperty(i)) { - this.nsps[i].initAdapter(); - } - } - return this; -}; - -/** - * Sets the allowed origins for requests. - * - * @param {String} v origins - * @return {Server|Adapter} self when setting or value when getting - * @api public - */ - -Server.prototype.origins = function(v){ - if (!arguments.length) return this._origins; - - this._origins = v; - return this; -}; - -/** - * Attaches socket.io to a server or port. - * - * @param {http.Server|Number} server or port - * @param {Object} options passed to engine.io - * @return {Server} self - * @api public - */ - -Server.prototype.listen = -Server.prototype.attach = function(srv, opts){ - if ('function' == typeof srv) { - var msg = 'You are trying to attach socket.io to an express ' + - 'request handler function. Please pass a http.Server instance.'; - throw new Error(msg); - } - - // handle a port as a string - if (Number(srv) == srv) { - srv = Number(srv); - } - - if ('number' == typeof srv) { - debug('creating http server and binding to %d', srv); - var port = srv; - srv = http.Server(function(req, res){ - res.writeHead(404); - res.end(); - }); - srv.listen(port); - - } - - // set engine.io path to `/socket.io` - opts = opts || {}; - opts.path = opts.path || this.path(); - // set origins verification - opts.allowRequest = opts.allowRequest || this.checkRequest.bind(this); - - // initialize engine - debug('creating engine.io instance with opts %j', opts); - this.eio = engine.attach(srv, opts); - - // attach static file serving - if (this._serveClient) this.attachServe(srv); - - // Export http server - this.httpServer = srv; - - // bind to engine events - this.bind(this.eio); - - return this; -}; - -/** - * Attaches the static file serving. - * - * @param {Function|http.Server} srv http server - * @api private - */ - -Server.prototype.attachServe = function(srv){ - debug('attaching client serving req handler'); - var url = this._path + '/socket.io.js'; - var evs = srv.listeners('request').slice(0); - var self = this; - srv.removeAllListeners('request'); - srv.on('request', function(req, res) { - if (0 === req.url.indexOf(url)) { - self.serve(req, res); - } else { - for (var i = 0; i < evs.length; i++) { - evs[i].call(srv, req, res); - } - } - }); -}; - -/** - * Handles a request serving `/socket.io.js` - * - * @param {http.Request} req - * @param {http.Response} res - * @api private - */ - -Server.prototype.serve = function(req, res){ - var etag = req.headers['if-none-match']; - if (etag) { - if (clientVersion == etag) { - debug('serve client 304'); - res.writeHead(304); - res.end(); - return; - } - } - - debug('serve client source'); - res.setHeader('Content-Type', 'application/javascript'); - res.setHeader('ETag', clientVersion); - res.writeHead(200); - res.end(clientSource); -}; - -/** - * Binds socket.io to an engine.io instance. - * - * @param {engine.Server} engine engine.io (or compatible) server - * @return {Server} self - * @api public - */ - -Server.prototype.bind = function(engine){ - this.engine = engine; - this.engine.on('connection', this.onconnection.bind(this)); - return this; -}; - -/** - * Called with each incoming transport connection. - * - * @param {engine.Socket} conn - * @return {Server} self - * @api public - */ - -Server.prototype.onconnection = function(conn){ - debug('incoming connection with id %s', conn.id); - var client = new Client(this, conn); - client.connect('/'); - return this; -}; - -/** - * Looks up a namespace. - * - * @param {String} name nsp name - * @param {Function} fn optional, nsp `connection` ev handler - * @api public - */ - -Server.prototype.of = function(name, fn){ - if (String(name)[0] !== '/') name = '/' + name; - - var nsp = this.nsps[name]; - if (!nsp) { - debug('initializing namespace %s', name); - nsp = new Namespace(this, name); - this.nsps[name] = nsp; - } - if (fn) nsp.on('connect', fn); - return nsp; -}; - -/** - * Closes server connection - * - * @api public - */ - -Server.prototype.close = function(){ - for (var id in this.nsps['/'].sockets) { - if (this.nsps['/'].sockets.hasOwnProperty(id)) { - this.nsps['/'].sockets[id].onclose(); - } - } - - this.engine.close(); - - if(this.httpServer){ - this.httpServer.close(); - } -}; - -/** - * Expose main namespace (/). - */ - -['on', 'to', 'in', 'use', 'emit', 'send', 'write', 'clients', 'compress'].forEach(function(fn){ - Server.prototype[fn] = function(){ - var nsp = this.sockets[fn]; - return nsp.apply(this.sockets, arguments); - }; -}); - -Namespace.flags.forEach(function(flag){ - Server.prototype.__defineGetter__(flag, function(){ - this.sockets.flags = this.sockets.flags || {}; - this.sockets.flags[flag] = true; - return this; - }); -}); - -/** - * BC with `io.listen` - */ - -Server.listen = Server; diff --git a/node_modules/socket.io/lib/namespace.js b/node_modules/socket.io/lib/namespace.js deleted file mode 100644 index a0be4f7..0000000 --- a/node_modules/socket.io/lib/namespace.js +++ /dev/null @@ -1,272 +0,0 @@ - -/** - * Module dependencies. - */ - -var Socket = require('./socket'); -var Emitter = require('events').EventEmitter; -var parser = require('socket.io-parser'); -var debug = require('debug')('socket.io:namespace'); -var hasBin = require('has-binary'); - -/** - * Module exports. - */ - -module.exports = exports = Namespace; - -/** - * Blacklisted events. - */ - -exports.events = [ - 'connect', // for symmetry with client - 'connection', - 'newListener' -]; - -/** - * Flags. - */ - -exports.flags = [ - 'json', - 'volatile' -]; - -/** - * `EventEmitter#emit` reference. - */ - -var emit = Emitter.prototype.emit; - -/** - * Namespace constructor. - * - * @param {Server} server instance - * @param {Socket} name - * @api private - */ - -function Namespace(server, name){ - this.name = name; - this.server = server; - this.sockets = {}; - this.connected = {}; - this.fns = []; - this.ids = 0; - this.initAdapter(); -} - -/** - * Inherits from `EventEmitter`. - */ - -Namespace.prototype.__proto__ = Emitter.prototype; - -/** - * Apply flags from `Socket`. - */ - -exports.flags.forEach(function(flag){ - Namespace.prototype.__defineGetter__(flag, function(){ - this.flags = this.flags || {}; - this.flags[flag] = true; - return this; - }); -}); - -/** - * Initializes the `Adapter` for this nsp. - * Run upon changing adapter by `Server#adapter` - * in addition to the constructor. - * - * @api private - */ - -Namespace.prototype.initAdapter = function(){ - this.adapter = new (this.server.adapter())(this); -}; - -/** - * Sets up namespace middleware. - * - * @return {Namespace} self - * @api public - */ - -Namespace.prototype.use = function(fn){ - this.fns.push(fn); - return this; -}; - -/** - * Executes the middleware for an incoming client. - * - * @param {Socket} socket that will get added - * @param {Function} fn last fn call in the middleware - * @api private - */ - -Namespace.prototype.run = function(socket, fn){ - var fns = this.fns.slice(0); - if (!fns.length) return fn(null); - - function run(i){ - fns[i](socket, function(err){ - // upon error, short-circuit - if (err) return fn(err); - - // if no middleware left, summon callback - if (!fns[i + 1]) return fn(null); - - // go on to next - run(i + 1); - }); - } - - run(0); -}; - -/** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - * @api public - */ - -Namespace.prototype.to = -Namespace.prototype['in'] = function(name){ - this.rooms = this.rooms || []; - if (!~this.rooms.indexOf(name)) this.rooms.push(name); - return this; -}; - -/** - * Adds a new client. - * - * @return {Socket} - * @api private - */ - -Namespace.prototype.add = function(client, fn){ - debug('adding socket to nsp %s', this.name); - var socket = new Socket(this, client); - var self = this; - this.run(socket, function(err){ - process.nextTick(function(){ - if ('open' == client.conn.readyState) { - if (err) return socket.error(err.data || err.message); - - // track socket - self.sockets[socket.id] = socket; - - // it's paramount that the internal `onconnect` logic - // fires before user-set events to prevent state order - // violations (such as a disconnection before the connection - // logic is complete) - socket.onconnect(); - if (fn) fn(); - - // fire user-set events - self.emit('connect', socket); - self.emit('connection', socket); - } else { - debug('next called after client was closed - ignoring socket'); - } - }); - }); - return socket; -}; - -/** - * Removes a client. Called by each `Socket`. - * - * @api private - */ - -Namespace.prototype.remove = function(socket){ - if (this.sockets.hasOwnProperty(socket.id)) { - delete this.sockets[socket.id]; - } else { - debug('ignoring remove for %s', socket.id); - } -}; - -/** - * Emits to all clients. - * - * @return {Namespace} self - * @api public - */ - -Namespace.prototype.emit = function(ev){ - if (~exports.events.indexOf(ev)) { - emit.apply(this, arguments); - } else { - // set up packet object - var args = Array.prototype.slice.call(arguments); - var parserType = parser.EVENT; // default - if (hasBin(args)) { parserType = parser.BINARY_EVENT; } // binary - - var packet = { type: parserType, data: args }; - - if ('function' == typeof args[args.length - 1]) { - throw new Error('Callbacks are not supported when broadcasting'); - } - - this.adapter.broadcast(packet, { - rooms: this.rooms, - flags: this.flags - }); - - delete this.rooms; - delete this.flags; - } - return this; -}; - -/** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - * @api public - */ - -Namespace.prototype.send = -Namespace.prototype.write = function(){ - var args = Array.prototype.slice.call(arguments); - args.unshift('message'); - this.emit.apply(this, args); - return this; -}; - -/** - * Gets a list of clients. - * - * @return {Namespace} self - * @api public - */ - -Namespace.prototype.clients = function(fn){ - this.adapter.clients(this.rooms, fn); - // delete rooms flag for scenario: - // .in('room').clients() (GH-1978) - delete this.rooms; - return this; -}; - -/** - * Sets the compress flag. - * - * @param {Boolean} compress if `true`, compresses the sending data - * @return {Socket} self - * @api public - */ - -Namespace.prototype.compress = function(compress){ - this.flags = this.flags || {}; - this.flags.compress = compress; - return this; -}; diff --git a/node_modules/socket.io/lib/socket.js b/node_modules/socket.io/lib/socket.js deleted file mode 100644 index de5ebb7..0000000 --- a/node_modules/socket.io/lib/socket.js +++ /dev/null @@ -1,470 +0,0 @@ - -/** - * Module dependencies. - */ - -var Emitter = require('events').EventEmitter; -var parser = require('socket.io-parser'); -var url = require('url'); -var debug = require('debug')('socket.io:socket'); -var hasBin = require('has-binary'); - -/** - * Module exports. - */ - -module.exports = exports = Socket; - -/** - * Blacklisted events. - * - * @api public - */ - -exports.events = [ - 'error', - 'connect', - 'disconnect', - 'newListener', - 'removeListener' -]; - -/** - * Flags. - * - * @api private - */ - -var flags = [ - 'json', - 'volatile', - 'broadcast' -]; - -/** - * `EventEmitter#emit` reference. - */ - -var emit = Emitter.prototype.emit; - -/** - * Interface to a `Client` for a given `Namespace`. - * - * @param {Namespace} nsp - * @param {Client} client - * @api public - */ - -function Socket(nsp, client){ - this.nsp = nsp; - this.server = nsp.server; - this.adapter = this.nsp.adapter; - this.id = nsp.name + '#' + client.id; - this.client = client; - this.conn = client.conn; - this.rooms = {}; - this.acks = {}; - this.connected = true; - this.disconnected = false; - this.handshake = this.buildHandshake(); -} - -/** - * Inherits from `EventEmitter`. - */ - -Socket.prototype.__proto__ = Emitter.prototype; - -/** - * Apply flags from `Socket`. - */ - -flags.forEach(function(flag){ - Socket.prototype.__defineGetter__(flag, function(){ - this.flags = this.flags || {}; - this.flags[flag] = true; - return this; - }); -}); - -/** - * `request` engine.io shortcut. - * - * @api public - */ - -Socket.prototype.__defineGetter__('request', function(){ - return this.conn.request; -}); - -/** - * Builds the `handshake` BC object - * - * @api private - */ - -Socket.prototype.buildHandshake = function(){ - return { - headers: this.request.headers, - time: (new Date) + '', - address: this.conn.remoteAddress, - xdomain: !!this.request.headers.origin, - secure: !!this.request.connection.encrypted, - issued: +(new Date), - url: this.request.url, - query: url.parse(this.request.url, true).query || {} - }; -}; - -/** - * Emits to this client. - * - * @return {Socket} self - * @api public - */ - -Socket.prototype.emit = function(ev){ - if (~exports.events.indexOf(ev)) { - emit.apply(this, arguments); - } else { - var args = Array.prototype.slice.call(arguments); - var packet = {}; - packet.type = hasBin(args) ? parser.BINARY_EVENT : parser.EVENT; - packet.data = args; - var flags = this.flags || {}; - - // access last argument to see if it's an ACK callback - if ('function' == typeof args[args.length - 1]) { - if (this._rooms || flags.broadcast) { - throw new Error('Callbacks are not supported when broadcasting'); - } - - debug('emitting packet with ack id %d', this.nsp.ids); - this.acks[this.nsp.ids] = args.pop(); - packet.id = this.nsp.ids++; - } - - if (this._rooms || flags.broadcast) { - this.adapter.broadcast(packet, { - except: [this.id], - rooms: this._rooms, - flags: flags - }); - } else { - // dispatch packet - this.packet(packet, { - volatile: flags.volatile, - compress: flags.compress - }); - } - - // reset flags - delete this._rooms; - delete this.flags; - } - return this; -}; - -/** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - * @api public - */ - -Socket.prototype.to = -Socket.prototype.in = function(name){ - this._rooms = this._rooms || []; - if (!~this._rooms.indexOf(name)) this._rooms.push(name); - return this; -}; - -/** - * Sends a `message` event. - * - * @return {Socket} self - * @api public - */ - -Socket.prototype.send = -Socket.prototype.write = function(){ - var args = Array.prototype.slice.call(arguments); - args.unshift('message'); - this.emit.apply(this, args); - return this; -}; - -/** - * Writes a packet. - * - * @param {Object} packet object - * @param {Object} opts options - * @api private - */ - -Socket.prototype.packet = function(packet, opts){ - packet.nsp = this.nsp.name; - opts = opts || {}; - opts.compress = false !== opts.compress; - this.client.packet(packet, opts); -}; - -/** - * Joins a room. - * - * @param {String} room - * @param {Function} fn optional, callback - * @return {Socket} self - * @api private - */ - -Socket.prototype.join = function(room, fn){ - debug('joining room %s', room); - var self = this; - if (this.rooms.hasOwnProperty(room)) { - fn && fn(null); - return this; - } - this.adapter.add(this.id, room, function(err){ - if (err) return fn && fn(err); - debug('joined room %s', room); - self.rooms[room] = room; - fn && fn(null); - }); - return this; -}; - -/** - * Leaves a room. - * - * @param {String} room - * @param {Function} fn optional, callback - * @return {Socket} self - * @api private - */ - -Socket.prototype.leave = function(room, fn){ - debug('leave room %s', room); - var self = this; - this.adapter.del(this.id, room, function(err){ - if (err) return fn && fn(err); - debug('left room %s', room); - delete self.rooms[room]; - fn && fn(null); - }); - return this; -}; - -/** - * Leave all rooms. - * - * @api private - */ - -Socket.prototype.leaveAll = function(){ - this.adapter.delAll(this.id); - this.rooms = {}; -}; - -/** - * Called by `Namespace` upon succesful - * middleware execution (ie: authorization). - * - * @api private - */ - -Socket.prototype.onconnect = function(){ - debug('socket connected - writing packet'); - this.nsp.connected[this.id] = this; - this.join(this.id); - this.packet({ type: parser.CONNECT }); -}; - -/** - * Called with each packet. Called by `Client`. - * - * @param {Object} packet - * @api private - */ - -Socket.prototype.onpacket = function(packet){ - debug('got packet %j', packet); - switch (packet.type) { - case parser.EVENT: - this.onevent(packet); - break; - - case parser.BINARY_EVENT: - this.onevent(packet); - break; - - case parser.ACK: - this.onack(packet); - break; - - case parser.BINARY_ACK: - this.onack(packet); - break; - - case parser.DISCONNECT: - this.ondisconnect(); - break; - - case parser.ERROR: - this.emit('error', packet.data); - } -}; - -/** - * Called upon event packet. - * - * @param {Object} packet object - * @api private - */ - -Socket.prototype.onevent = function(packet){ - var args = packet.data || []; - debug('emitting event %j', args); - - if (null != packet.id) { - debug('attaching ack callback to event'); - args.push(this.ack(packet.id)); - } - - emit.apply(this, args); -}; - -/** - * Produces an ack callback to emit with an event. - * - * @param {Number} id packet id - * @api private - */ - -Socket.prototype.ack = function(id){ - var self = this; - var sent = false; - return function(){ - // prevent double callbacks - if (sent) return; - var args = Array.prototype.slice.call(arguments); - debug('sending ack %j', args); - - var type = hasBin(args) ? parser.BINARY_ACK : parser.ACK; - self.packet({ - id: id, - type: type, - data: args - }); - - sent = true; - }; -}; - -/** - * Called upon ack packet. - * - * @api private - */ - -Socket.prototype.onack = function(packet){ - var ack = this.acks[packet.id]; - if ('function' == typeof ack) { - debug('calling ack %s with %j', packet.id, packet.data); - ack.apply(this, packet.data); - delete this.acks[packet.id]; - } else { - debug('bad ack %s', packet.id); - } -}; - -/** - * Called upon client disconnect packet. - * - * @api private - */ - -Socket.prototype.ondisconnect = function(){ - debug('got disconnect packet'); - this.onclose('client namespace disconnect'); -}; - -/** - * Handles a client error. - * - * @api private - */ - -Socket.prototype.onerror = function(err){ - if (this.listeners('error').length) { - this.emit('error', err); - } else { - console.error('Missing error handler on `socket`.'); - console.error(err.stack); - } -}; - -/** - * Called upon closing. Called by `Client`. - * - * @param {String} reason - * @throw {Error} optional error object - * @api private - */ - -Socket.prototype.onclose = function(reason){ - if (!this.connected) return this; - debug('closing socket - reason %s', reason); - this.leaveAll(); - this.nsp.remove(this); - this.client.remove(this); - this.connected = false; - this.disconnected = true; - delete this.nsp.connected[this.id]; - this.emit('disconnect', reason); -}; - -/** - * Produces an `error` packet. - * - * @param {Object} err error object - * @api private - */ - -Socket.prototype.error = function(err){ - this.packet({ type: parser.ERROR, data: err }); -}; - -/** - * Disconnects this client. - * - * @param {Boolean} close if `true`, closes the underlying connection - * @return {Socket} self - * @api public - */ - -Socket.prototype.disconnect = function(close){ - if (!this.connected) return this; - if (close) { - this.client.disconnect(); - } else { - this.packet({ type: parser.DISCONNECT }); - this.onclose('server namespace disconnect'); - } - return this; -}; - -/** - * Sets the compress flag. - * - * @param {Boolean} compress if `true`, compresses the sending data - * @return {Socket} self - * @api public - */ - -Socket.prototype.compress = function(compress){ - this.flags = this.flags || {}; - this.flags.compress = compress; - return this; -}; -- cgit v1.2.3