App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/third-party/Socket.IO-node/support/socket.io-client/lib/transport.js view on Meta::CPAN
* it will automatically update the timeout, decode the message and
* forwards the response to the onMessage function for further processing.
*
* @param {String} data Response from the server.
* @api private
*/
Transport.prototype.onData = function(data){
this.setTimeout();
var msgs = this.decode(data);
if (msgs && msgs.length){
for (var i = 0, l = msgs.length; i < l; i++){
this.onMessage(msgs[i]);
}
}
};
/**
* All the transports have a dedicated timeout to detect if
* the connection is still alive. We clear the existing timer
* and set new one each time this function is called. When the
* timeout does occur it will call the `onTimeout` method.
*
* @api private
*/
Transport.prototype.setTimeout = function(){
var self = this;
if (this.timeout) clearTimeout(this.timeout);
this.timeout = setTimeout(function(){
self.onTimeout();
}, this.options.timeout);
};
/**
* Disconnect from the Socket.IO server when a timeout occurs.
*
* @api private
*/
Transport.prototype.onTimeout = function(){
this.onDisconnect();
};
/**
* After the response from the server has been parsed to individual
* messages we need to decode them using the the Socket.IO message
* protocol: <https://github.com/learnboost/socket.io-node/>.
*
* When a message is received we check if a session id has been set,
* if the session id is missing we can assume that the received message
* contains the sessionid of the connection.
* When a message is prefixed with `~h~` we dispatch it our heartbeat
* processing method `onHeartbeat` with the content of the heartbeat.
*
* When the message is prefixed with `~j~` we can assume that the contents
* of the message is JSON encoded, so we parse the message and notify
* the base of the new message.
*
* If none of the above, we consider it just a plain text message and
* notify the base of the new message.
*
* @param {String} message A decoded message from the server.
* @api private
*/
Transport.prototype.onMessage = function(message){
if (!this.sessionid){
this.sessionid = message;
this.onConnect();
} else if (message.substr(0, 3) == '~h~'){
this.onHeartbeat(message.substr(3));
} else if (message.substr(0, 3) == '~j~'){
this.base.onMessage(JSON.parse(message.substr(3)));
} else {
this.base.onMessage(message);
}
},
/**
* Send the received heartbeat message back to server. So the server
* knows we are still connected.
*
* @param {String} heartbeat Heartbeat response from the server.
* @api private
*/
Transport.prototype.onHeartbeat = function(heartbeat){
this.send('~h~' + heartbeat); // echo
};
/**
* Notifies the base when a connection to the Socket.IO server has
* been established. And it starts the connection `timeout` timer.
*
* @api private
*/
Transport.prototype.onConnect = function(){
this.connected = true;
this.connecting = false;
this.base.onConnect();
this.setTimeout();
};
/**
* Notifies the base when the connection with the Socket.IO server
* has been disconnected.
*
* @api private
*/
Transport.prototype.onDisconnect = function(){
this.connecting = false;
this.connected = false;
this.sessionid = null;
this.base.onDisconnect();
};
/**
* Generates a connection url based on the Socket.IO URL Protocol.
* See <https://github.com/learnboost/socket.io-node/> for more details.
*
* @returns {String} Connection url
* @api private
*/
Transport.prototype.prepareUrl = function(){
( run in 1.575 second using v1.01-cache-2.11-cpan-39bf76dae61 )