mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
40 lines
872 B
JavaScript
40 lines
872 B
JavaScript
|
import SockJS from 'sockjs-client'
|
||
|
|
||
|
let retries = 0
|
||
|
let sock = null
|
||
|
|
||
|
export default function socket (url, handlers) {
|
||
|
sock = new SockJS(url)
|
||
|
|
||
|
sock.onopen = () => {
|
||
|
retries = 0
|
||
|
}
|
||
|
|
||
|
sock.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`.
|
||
|
const retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100
|
||
|
retries += 1
|
||
|
|
||
|
setTimeout(() => {
|
||
|
socket(url, handlers)
|
||
|
}, retryInMs)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sock.onmessage = (e) => {
|
||
|
// This assumes that all data sent via the websocket is JSON.
|
||
|
const msg = JSON.parse(e.data)
|
||
|
if (handlers[msg.type]) {
|
||
|
handlers[msg.type](msg.data)
|
||
|
}
|
||
|
}
|
||
|
}
|