You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.0 KiB
65 lines
2.0 KiB
/* global __webpack_dev_server_client__ */ |
|
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 |
|
|
|
/* eslint-disable camelcase */ |
|
|
|
var Client = // eslint-disable-next-line no-nested-ternary |
|
typeof __webpack_dev_server_client__ !== "undefined" ? typeof __webpack_dev_server_client__.default !== "undefined" ? __webpack_dev_server_client__.default : __webpack_dev_server_client__ : WebSocketClient; |
|
/* eslint-enable camelcase */ |
|
|
|
var retries = 0; |
|
var maxRetries = 10; // Initialized client is exported so external consumers can utilize the same instance |
|
// It is mutable to enforce singleton |
|
// eslint-disable-next-line import/no-mutable-exports |
|
|
|
export var client = null; |
|
/** |
|
* @param {string} url |
|
* @param {{ [handler: string]: (data?: any, params?: any) => any }} handlers |
|
* @param {number} [reconnect] |
|
*/ |
|
|
|
var socket = function initSocket(url, handlers, reconnect) { |
|
client = new Client(url); |
|
client.onOpen(function () { |
|
retries = 0; |
|
|
|
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`. |
|
// eslint-disable-next-line no-restricted-properties |
|
var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100; |
|
retries += 1; |
|
log.info("Trying to reconnect..."); |
|
setTimeout(function () { |
|
socket(url, handlers, reconnect); |
|
}, retryInMs); |
|
} |
|
}); |
|
client.onMessage( |
|
/** |
|
* @param {any} data |
|
*/ |
|
function (data) { |
|
var message = JSON.parse(data); |
|
|
|
if (handlers[message.type]) { |
|
handlers[message.type](message.data, message.params); |
|
} |
|
}); |
|
}; |
|
|
|
export default socket; |