| '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; |