postal.js/example/node/node_modules/socket.io/lib/client.js

166 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 );
}
};