/**
* 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);
}
};