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.
45 lines
1.0 KiB
45 lines
1.0 KiB
'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; |