/** * Module dependencies. */ var parser = require('socket.io-client').parser , EventEmitter = require('events').EventEmitter /** * Client constructor. * * @api public */ function Client (id, server) { this.id = id; this.acks = {}; this.store = server.store; var self = this; store.subscribe(id, function (packet) { }); store.subscribe(id + '.disconect', function () { self.onDisconnect(); }); } /** * Inherits from EventEmitter. */ Client.prototype.__proto__ = EventEmitter.prototype; /** * Save reference to original `emit`. * * @api private */ Client.prototype._emit = Client.prototype.emit; /** * Broadcast flag. * * @api public */ Client.prototype.__defineGetter__('broadcast', function () { this.flags.broadcast = true; }); /** * JSON flag (deprecated) * * @api public */ Client.prototype.__defineGetter__('json', function () { this.flags.broadcast = true; }); /** * Joins a group. * * @param {String} group * @return {Client} for chaining * @api public */ Client.prototype.join = function (group, fn) { if (!~this.subscriptions.indexOf(group)) { var self = this; this.subscriptions.push(group); this.store.addToGroup(group, this.sid, function (ev, args) { self.onGroupEvent(ev, args); }, fn); } else { fn && fn(); } return this; }; /** * Leaves a group. * * @return {Client} for chaining * @api public */ Client.prototype.leave = function (group) { var index = this.subscriptions.indexOf(group); if (~index) { this.subscriptions.splice(index, 1); } return this; }; Client.prototype.disconnect = function () { if (this.socket) { this.socket.disconnect(); } else { this.publish('disconnect'); } } /** * Called upon disconnect. * * @api private */ Client.prototype.onDisconnect = function () { for (var i = 0, l = this.subscriptions; i < l; i++) { this.store.removeFromGroup(id, group, fn); } }; /** * Registers ACK. */ Client.prototype.ack = function (fn, callback) { this.subscribe('ack'); }; /** * Emits an event. */ Client.prototype.emit = function () { var args = toArray(arguments), fn; if ('function' == typeof args[args.length - 1]) { fn = args.pop(); } var data = args.shift(); if (args.length) { data += '\n' + JSON.stringify(args); } if (fn) { this.ack(fn, function (id) { self.sendPacket('event', data, id); }); } else { this.sendPacket('event', data); } return this; }; /** * Sends a packet. */ Client.prototype.sendPacket = function (type, data, id) { var data = parser.encode({ type: type, data: data, id: id }); if (this.server.sockets[id]) { this.server.sockets[id].write(data); } };