diff --git a/lib/socket.js b/lib/socket.js index 0af8a2418..d3bd1ae7d 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -36,6 +36,7 @@ , 'sync disconnect on unload': true , 'auto connect': true , 'flash policy port': 10843 + , orphan:false }; io.util.merge(this.options, options); @@ -48,6 +49,8 @@ this.buffer = []; this.doBuffer = false; + if(this.options.orphan) return; + if (this.options['sync disconnect on unload'] && (!this.isXDomain() || io.util.ua.hasCORS)) { var self = this; @@ -93,6 +96,8 @@ */ Socket.prototype.publish = function () { + if(this.options.orphan) return; + this.emit.apply(this, arguments); var nsp; @@ -211,7 +216,7 @@ self.setHeartbeatTimeout(); function connect (transports){ - if (self.transport) self.transport.clearTimeouts(); + if (self.transport) self.transport.detach(); self.transport = self.getTransport(transports); if (!self.transport) return self.publish('connect_failed'); @@ -423,6 +428,8 @@ */ Socket.prototype.onError = function (err) { + if(this.options.orphan) return; + if (err && err.advice) { if (err.advice === 'reconnect' && (this.connected || this.connecting)) { this.disconnect(); diff --git a/lib/transport.js b/lib/transport.js index 0be6755a9..1be0f54bf 100644 --- a/lib/transport.js +++ b/lib/transport.js @@ -156,6 +156,17 @@ } }; + /** + * To detach/isolate transport from the associated socket + * useful to avoid the effect of this transport when + * socket already fallback/connecting/connected to other transport + */ + Transport.prototype.detach = function () { + this.socket = new io.Socket({orphan:true, reconnect:false}); + this.clearTimeouts(); + this.close(); + }; + /** * Sends a packet *