90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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;
 |