| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | 'use strict';/* global self */var url = require('url');var getCurrentScriptSource = require('./getCurrentScriptSource');function createSocketUrl(resourceQuery, currentLocation) {  var urlParts;  if (typeof resourceQuery === 'string' && resourceQuery !== '') {    // If this bundle is inlined, use the resource query to get the correct url.    // format is like `?http://0.0.0.0:8096&sockPort=8097&sockHost=localhost`    urlParts = url.parse(resourceQuery // strip leading `?` from query string to get a valid URL    .substr(1) // replace first `&` with `?` to have a valid query string    .replace('&', '?'), true);  } else {    // Else, get the url from the <script> this file was called with.    var scriptHost = getCurrentScriptSource();    urlParts = url.parse(scriptHost || '/', true, true);  } // Use parameter to allow passing location in unit tests  if (typeof currentLocation === 'string' && currentLocation !== '') {    currentLocation = url.parse(currentLocation);  } else {    currentLocation = self.location;  }  return getSocketUrl(urlParts, currentLocation);}/* * Gets socket URL based on Script Source/Location * (scriptSrc: URL, location: URL) -> URL */function getSocketUrl(urlParts, loc) {  var auth = urlParts.auth,      query = urlParts.query;  var hostname = urlParts.hostname,      protocol = urlParts.protocol,      port = urlParts.port;  if (!port || port === '0') {    port = loc.port;  } // check ipv4 and ipv6 `all hostname`  // why do we need this check?  // hostname n/a for file protocol (example, when using electron, ionic)  // see: https://github.com/webpack/webpack-dev-server/pull/384  if ((hostname === '0.0.0.0' || hostname === '::') && loc.hostname && loc.protocol.indexOf('http') === 0) {    hostname = loc.hostname;  } // `hostname` can be empty when the script path is relative. In that case, specifying  // a protocol would result in an invalid URL.  // When https is used in the app, secure websockets are always necessary  // because the browser doesn't accept non-secure websockets.  if (hostname && hostname !== '127.0.0.1' && (loc.protocol === 'https:' || urlParts.hostname === '0.0.0.0')) {    protocol = loc.protocol;  } // all of these sock url params are optionally passed in through  // resourceQuery, so we need to fall back to the default if  // they are not provided  var sockHost = query.sockHost || hostname;  var sockPath = query.sockPath || '/sockjs-node';  var sockPort = query.sockPort || port;  if (sockPort === 'location') {    sockPort = loc.port;  }  return url.format({    protocol: protocol,    auth: auth,    hostname: sockHost,    port: sockPort,    // If sockPath is provided it'll be passed in via the resourceQuery as a    // query param so it has to be parsed out of the querystring in order for the    // client to open the socket to the correct location.    pathname: sockPath  });}module.exports = createSocketUrl;
 |