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;