| 'use strict'; | 
|   | 
| var EventEmitter = require('events').EventEmitter | 
|   , inherits = require('inherits') | 
|   , urlUtils = require('./utils/url') | 
|   , XDR = require('./transport/sender/xdr') | 
|   , XHRCors = require('./transport/sender/xhr-cors') | 
|   , XHRLocal = require('./transport/sender/xhr-local') | 
|   , XHRFake = require('./transport/sender/xhr-fake') | 
|   , InfoIframe = require('./info-iframe') | 
|   , InfoAjax = require('./info-ajax') | 
|   ; | 
|   | 
| var debug = function() {}; | 
| if (process.env.NODE_ENV !== 'production') { | 
|   debug = require('debug')('sockjs-client:info-receiver'); | 
| } | 
|   | 
| function InfoReceiver(baseUrl, urlInfo) { | 
|   debug(baseUrl); | 
|   var self = this; | 
|   EventEmitter.call(this); | 
|   | 
|   setTimeout(function() { | 
|     self.doXhr(baseUrl, urlInfo); | 
|   }, 0); | 
| } | 
|   | 
| inherits(InfoReceiver, EventEmitter); | 
|   | 
| // TODO this is currently ignoring the list of available transports and the whitelist | 
|   | 
| InfoReceiver._getReceiver = function(baseUrl, url, urlInfo) { | 
|   // determine method of CORS support (if needed) | 
|   if (urlInfo.sameOrigin) { | 
|     return new InfoAjax(url, XHRLocal); | 
|   } | 
|   if (XHRCors.enabled) { | 
|     return new InfoAjax(url, XHRCors); | 
|   } | 
|   if (XDR.enabled && urlInfo.sameScheme) { | 
|     return new InfoAjax(url, XDR); | 
|   } | 
|   if (InfoIframe.enabled()) { | 
|     return new InfoIframe(baseUrl, url); | 
|   } | 
|   return new InfoAjax(url, XHRFake); | 
| }; | 
|   | 
| InfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) { | 
|   var self = this | 
|     , url = urlUtils.addPath(baseUrl, '/info') | 
|     ; | 
|   debug('doXhr', url); | 
|   | 
|   this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo); | 
|   | 
|   this.timeoutRef = setTimeout(function() { | 
|     debug('timeout'); | 
|     self._cleanup(false); | 
|     self.emit('finish'); | 
|   }, InfoReceiver.timeout); | 
|   | 
|   this.xo.once('finish', function(info, rtt) { | 
|     debug('finish', info, rtt); | 
|     self._cleanup(true); | 
|     self.emit('finish', info, rtt); | 
|   }); | 
| }; | 
|   | 
| InfoReceiver.prototype._cleanup = function(wasClean) { | 
|   debug('_cleanup'); | 
|   clearTimeout(this.timeoutRef); | 
|   this.timeoutRef = null; | 
|   if (!wasClean && this.xo) { | 
|     this.xo.close(); | 
|   } | 
|   this.xo = null; | 
| }; | 
|   | 
| InfoReceiver.prototype.close = function() { | 
|   debug('close'); | 
|   this.removeAllListeners(); | 
|   this._cleanup(false); | 
| }; | 
|   | 
| InfoReceiver.timeout = 8000; | 
|   | 
| module.exports = InfoReceiver; |