github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/themes/wind/static/libs/sockjs-client-1.1.0/lib/iframe-bootstrap.js (about)

     1  'use strict';
     2  
     3  var urlUtils = require('./utils/url')
     4    , eventUtils = require('./utils/event')
     5    , JSON3 = require('json3')
     6    , FacadeJS = require('./facade')
     7    , InfoIframeReceiver = require('./info-iframe-receiver')
     8    , iframeUtils = require('./utils/iframe')
     9    , loc = require('./location')
    10    ;
    11  
    12  var debug = function() {};
    13  if (process.env.NODE_ENV !== 'production') {
    14    debug = require('debug')('sockjs-client:iframe-bootstrap');
    15  }
    16  
    17  module.exports = function(SockJS, availableTransports) {
    18    var transportMap = {};
    19    availableTransports.forEach(function(at) {
    20      if (at.facadeTransport) {
    21        transportMap[at.facadeTransport.transportName] = at.facadeTransport;
    22      }
    23    });
    24  
    25    // hard-coded for the info iframe
    26    // TODO see if we can make this more dynamic
    27    transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver;
    28    var parentOrigin;
    29  
    30    /* eslint-disable camelcase */
    31    SockJS.bootstrap_iframe = function() {
    32      /* eslint-enable camelcase */
    33      var facade;
    34      iframeUtils.currentWindowId = loc.hash.slice(1);
    35      var onMessage = function(e) {
    36        if (e.source !== parent) {
    37          return;
    38        }
    39        if (typeof parentOrigin === 'undefined') {
    40          parentOrigin = e.origin;
    41        }
    42        if (e.origin !== parentOrigin) {
    43          return;
    44        }
    45  
    46        var iframeMessage;
    47        try {
    48          iframeMessage = JSON3.parse(e.data);
    49        } catch (ignored) {
    50          debug('bad json', e.data);
    51          return;
    52        }
    53  
    54        if (iframeMessage.windowId !== iframeUtils.currentWindowId) {
    55          return;
    56        }
    57        switch (iframeMessage.type) {
    58        case 's':
    59          var p;
    60          try {
    61            p = JSON3.parse(iframeMessage.data);
    62          } catch (ignored) {
    63            debug('bad json', iframeMessage.data);
    64            break;
    65          }
    66          var version = p[0];
    67          var transport = p[1];
    68          var transUrl = p[2];
    69          var baseUrl = p[3];
    70          debug(version, transport, transUrl, baseUrl);
    71          // change this to semver logic
    72          if (version !== SockJS.version) {
    73            throw new Error('Incompatible SockJS! Main site uses:' +
    74                      ' "' + version + '", the iframe:' +
    75                      ' "' + SockJS.version + '".');
    76          }
    77  
    78          if (!urlUtils.isOriginEqual(transUrl, loc.href) ||
    79              !urlUtils.isOriginEqual(baseUrl, loc.href)) {
    80            throw new Error('Can\'t connect to different domain from within an ' +
    81                      'iframe. (' + loc.href + ', ' + transUrl + ', ' + baseUrl + ')');
    82          }
    83          facade = new FacadeJS(new transportMap[transport](transUrl, baseUrl));
    84          break;
    85        case 'm':
    86          facade._send(iframeMessage.data);
    87          break;
    88        case 'c':
    89          if (facade) {
    90            facade._close();
    91          }
    92          facade = null;
    93          break;
    94        }
    95      };
    96  
    97      eventUtils.attachEvent('message', onMessage);
    98  
    99      // Start
   100      iframeUtils.postMessage('s');
   101    };
   102  };