You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							89 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							89 lines
						
					
					
						
							2.2 KiB
						
					
					
				'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;
 | 
						|
 |