Merge remote-tracking branch 'learnboost/master'

This commit is contained in:
Daniel Shaw
2011-08-06 19:07:27 -07:00

View File

@@ -104,6 +104,13 @@ function Manager (server, options) {
self.handleUpgrade(req, socket, head);
});
server.on('close', function () {
clearInterval(self.gc);
});
// run our private gc every 10 seconds
this.gc = setInterval(this.garbageCollection.bind(this), 10000);
for (var i in transports) {
if (transports[i].init) {
transports[i].init(this);
@@ -597,9 +604,10 @@ Manager.prototype.handleClient = function (data, req) {
return;
}
var transport = new transports[data.transport](this, data, req);
var transport = new transports[data.transport](this, data, req)
, handshaken = this.handshaken[data.id];
if (this.handshaken[data.id]) {
if (handshaken) {
if (transport.open) {
if (this.closed[data.id] && this.closed[data.id].length) {
transport.payload(this.closed[data.id]);
@@ -615,6 +623,11 @@ Manager.prototype.handleClient = function (data, req) {
this.onConnect(data.id);
this.store.publish('connect', data.id);
// flag as used
delete handshaken.issued;
this.onHandshake(data.id, handshaken);
this.store.publish('handshake', data.id, handshaken);
// initialize the socket for all namespaces
for (var i in this.namespaces) {
var socket = this.namespaces[i].socket(data.id, true);
@@ -822,7 +835,8 @@ Manager.prototype.handleHandshake = function (data, req, res) {
Manager.prototype.handshakeData = function (data) {
var connection = data.request.connection
, connectionAddress;
, connectionAddress
, date = new Date;
if (connection.remoteAddress) {
connectionAddress = {
@@ -839,11 +853,12 @@ Manager.prototype.handshakeData = function (data) {
return {
headers: data.headers
, address: connectionAddress
, time: (new Date).toString()
, time: date.toString()
, query: data.query
, url: data.request.url
, xdomain: !!data.request.headers.origin
, secure: data.request.connection.secure
, issued: +date
};
};
@@ -973,6 +988,8 @@ Manager.prototype.checkRequest = function (req) {
/**
* Declares a socket namespace
*
* @api public
*/
Manager.prototype.of = function (nsp) {
@@ -982,3 +999,26 @@ Manager.prototype.of = function (nsp) {
return this.namespaces[nsp] = new SocketNamespace(this, nsp);
};
/**
* Perform garbage collection on long living objects and properties that cannot
* be removed automatically.
*
* @api private
*/
Manager.prototype.garbageCollection = function () {
// clean up unused handshakes
var ids = Object.keys(this.handshaken)
, i = ids.length
, now = Date.now()
, handshake;
while (i--) {
handshake = this.handshaken[ids[i]];
if ('issued' in handshake && (now - handshake.issued) >= 3E4) {
this.onDisconnect(ids[i]);
}
}
};