aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack-hot-client/client/socket.js
blob: 3184725523aa19043ed8a6f4a626a062c7f8b968 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
'use strict';

var url = require('url');

var log = require('./log');

var maxRetries = 10;
var retry = maxRetries;

module.exports = function connect(options, handler) {
  var socketUrl = url.format({
    protocol: options.https ? 'wss' : 'ws',
    hostname: options.webSocket.host,
    port: options.webSocket.port,
    slashes: true
  });
  var open = false;
  var socket = new WebSocket(socketUrl);
  socket.addEventListener('open', function () {
    open = true;
    retry = maxRetries;
    log.info('WebSocket connected');
  });
  socket.addEventListener('close', function () {
    log.warn('WebSocket closed');
    open = false;
    socket = null; // exponentation operator ** isn't supported by IE at all
    // eslint-disable-next-line no-restricted-properties

    var timeout = 1000 * Math.pow(maxRetries - retry, 2) + Math.random() * 100;

    if (open || retry <= 0) {
      log.warn("WebSocket: ending reconnect after ".concat(maxRetries, " attempts"));
      return;
    }

    log.info("WebSocket: attempting reconnect in ".concat(parseInt(timeout / 1000, 10), "s"));
    setTimeout(function () {
      retry -= 1;
      connect(options, handler);
    }, timeout);
  });
  socket.addEventListener('message', function (event) {
    log.debug('WebSocket: message:', event.data);
    var message = JSON.parse(event.data);

    if (handler[message.type]) {
      handler[message.type](message.data);
    }
  });
};