46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
'use strict';
|
|
|
|
var SockJS = require('sockjs-client/dist/sockjs');
|
|
|
|
var retries = 0;
|
|
var sock = null;
|
|
|
|
var socket = function initSocket(url, handlers) {
|
|
sock = new SockJS(url);
|
|
|
|
sock.onopen = function onopen() {
|
|
retries = 0;
|
|
};
|
|
|
|
sock.onclose = function onclose() {
|
|
if (retries === 0) {
|
|
handlers.close();
|
|
}
|
|
|
|
// Try to reconnect.
|
|
sock = null;
|
|
|
|
// After 10 retries stop trying, to prevent logspam.
|
|
if (retries <= 10) {
|
|
// Exponentially increase timeout to reconnect.
|
|
// Respectfully copied from the package `got`.
|
|
// eslint-disable-next-line no-mixed-operators, no-restricted-properties
|
|
var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100;
|
|
retries += 1;
|
|
|
|
setTimeout(function () {
|
|
socket(url, handlers);
|
|
}, retryInMs);
|
|
}
|
|
};
|
|
|
|
sock.onmessage = function onmessage(e) {
|
|
// This assumes that all data sent via the websocket is JSON.
|
|
var msg = JSON.parse(e.data);
|
|
if (handlers[msg.type]) {
|
|
handlers[msg.type](msg.data);
|
|
}
|
|
};
|
|
};
|
|
|
|
module.exports = socket; |