github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/themes/wind/static/libs/sockjs-client-1.1.0/lib/info-receiver.js (about) 1 'use strict'; 2 3 var EventEmitter = require('events').EventEmitter 4 , inherits = require('inherits') 5 , urlUtils = require('./utils/url') 6 , XDR = require('./transport/sender/xdr') 7 , XHRCors = require('./transport/sender/xhr-cors') 8 , XHRLocal = require('./transport/sender/xhr-local') 9 , XHRFake = require('./transport/sender/xhr-fake') 10 , InfoIframe = require('./info-iframe') 11 , InfoAjax = require('./info-ajax') 12 ; 13 14 var debug = function() {}; 15 if (process.env.NODE_ENV !== 'production') { 16 debug = require('debug')('sockjs-client:info-receiver'); 17 } 18 19 function InfoReceiver(baseUrl, urlInfo) { 20 debug(baseUrl); 21 var self = this; 22 EventEmitter.call(this); 23 24 setTimeout(function() { 25 self.doXhr(baseUrl, urlInfo); 26 }, 0); 27 } 28 29 inherits(InfoReceiver, EventEmitter); 30 31 // TODO this is currently ignoring the list of available transports and the whitelist 32 33 InfoReceiver._getReceiver = function(baseUrl, url, urlInfo) { 34 // determine method of CORS support (if needed) 35 if (urlInfo.sameOrigin) { 36 return new InfoAjax(url, XHRLocal); 37 } 38 if (XHRCors.enabled) { 39 return new InfoAjax(url, XHRCors); 40 } 41 if (XDR.enabled && urlInfo.sameScheme) { 42 return new InfoAjax(url, XDR); 43 } 44 if (InfoIframe.enabled()) { 45 return new InfoIframe(baseUrl, url); 46 } 47 return new InfoAjax(url, XHRFake); 48 }; 49 50 InfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) { 51 var self = this 52 , url = urlUtils.addPath(baseUrl, '/info') 53 ; 54 debug('doXhr', url); 55 56 this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo); 57 58 this.timeoutRef = setTimeout(function() { 59 debug('timeout'); 60 self._cleanup(false); 61 self.emit('finish'); 62 }, InfoReceiver.timeout); 63 64 this.xo.once('finish', function(info, rtt) { 65 debug('finish', info, rtt); 66 self._cleanup(true); 67 self.emit('finish', info, rtt); 68 }); 69 }; 70 71 InfoReceiver.prototype._cleanup = function(wasClean) { 72 debug('_cleanup'); 73 clearTimeout(this.timeoutRef); 74 this.timeoutRef = null; 75 if (!wasClean && this.xo) { 76 this.xo.close(); 77 } 78 this.xo = null; 79 }; 80 81 InfoReceiver.prototype.close = function() { 82 debug('close'); 83 this.removeAllListeners(); 84 this._cleanup(false); 85 }; 86 87 InfoReceiver.timeout = 8000; 88 89 module.exports = InfoReceiver;