/** * The following code is modified based on * https://github.com/webpack/webpack-dev-server * * MIT Licensed * Author Tobias Koppers @sokra * Copyright (c) JS Foundation and other contributors * https://github.com/webpack/webpack-dev-server/blob/main/LICENSE */ import WebSocketClient from './clients/WebSocketClient.js'; import { log } from './utils/log.js'; // this WebsocketClient is here as a default fallback, in case the client is not injected var Client = typeof __webpack_dev_server_client__ !== 'undefined' ? typeof __webpack_dev_server_client__.default !== 'undefined' ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : WebSocketClient; var retries = 0; var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance // It is mutable to enforce singleton export var client = null; var timeout; function socket(url, handlers, reconnect) { client = new Client(url); client.onOpen(function () { retries = 0; if (timeout) { clearTimeout(timeout); } if (typeof reconnect !== 'undefined') { maxRetries = reconnect; } }); client.onClose(function () { if (retries === 0) { handlers.close(); } // Try to reconnect. client = null; // After 10 retries stop trying, to prevent logspam. if (retries < maxRetries) { // Exponentially increase timeout to reconnect. // Respectfully copied from the package `got`. var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; retries += 1; log.info('Trying to reconnect...'); timeout = setTimeout(function () { socket(url, handlers, reconnect); }, retryInMs); } }); client.onMessage(function (data) { var message = JSON.parse(data); if (handlers[message.type]) { handlers[message.type](message.data, message.params); } }); } export default socket;