| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | 'use strict';var urlUtils = require('./utils/url')  , eventUtils = require('./utils/event')  , FacadeJS = require('./facade')  , InfoIframeReceiver = require('./info-iframe-receiver')  , iframeUtils = require('./utils/iframe')  , loc = require('./location')  ;var debug = function() {};if (process.env.NODE_ENV !== 'production') {  debug = require('debug')('sockjs-client:iframe-bootstrap');}module.exports = function(SockJS, availableTransports) {  var transportMap = {};  availableTransports.forEach(function(at) {    if (at.facadeTransport) {      transportMap[at.facadeTransport.transportName] = at.facadeTransport;    }  });  // hard-coded for the info iframe  // TODO see if we can make this more dynamic  transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver;  var parentOrigin;  /* eslint-disable camelcase */  SockJS.bootstrap_iframe = function() {    /* eslint-enable camelcase */    var facade;    iframeUtils.currentWindowId = loc.hash.slice(1);    var onMessage = function(e) {      if (e.source !== parent) {        return;      }      if (typeof parentOrigin === 'undefined') {        parentOrigin = e.origin;      }      if (e.origin !== parentOrigin) {        return;      }      var iframeMessage;      try {        iframeMessage = JSON.parse(e.data);      } catch (ignored) {        debug('bad json', e.data);        return;      }      if (iframeMessage.windowId !== iframeUtils.currentWindowId) {        return;      }      switch (iframeMessage.type) {      case 's':        var p;        try {          p = JSON.parse(iframeMessage.data);        } catch (ignored) {          debug('bad json', iframeMessage.data);          break;        }        var version = p[0];        var transport = p[1];        var transUrl = p[2];        var baseUrl = p[3];        debug(version, transport, transUrl, baseUrl);        // change this to semver logic        if (version !== SockJS.version) {          throw new Error('Incompatible SockJS! Main site uses:' +                    ' "' + version + '", the iframe:' +                    ' "' + SockJS.version + '".');        }        if (!urlUtils.isOriginEqual(transUrl, loc.href) ||            !urlUtils.isOriginEqual(baseUrl, loc.href)) {          throw new Error('Can\'t connect to different domain from within an ' +                    'iframe. (' + loc.href + ', ' + transUrl + ', ' + baseUrl + ')');        }        facade = new FacadeJS(new transportMap[transport](transUrl, baseUrl));        break;      case 'm':        facade._send(iframeMessage.data);        break;      case 'c':        if (facade) {          facade._close();        }        facade = null;        break;      }    };    eventUtils.attachEvent('message', onMessage);    // Start    iframeUtils.postMessage('s');  };};
 |