mirror of
https://github.com/viq/NewsBlur.git
synced 2025-08-05 16:49:45 +00:00
168 lines
2.7 KiB
JavaScript
168 lines
2.7 KiB
JavaScript
![]() |
|
||
|
/**
|
||
|
* 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);
|
||
|
}
|
||
|
};
|