mirror of
https://github.com/Hopiu/postal.js.git
synced 2026-03-17 14:40:24 +00:00
166 lines
2.7 KiB
JavaScript
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 );
|
|
}
|
|
};
|