fix(islands/IsOnline): avoid concurrent websocket and refactor openSocket

This commit is contained in:
Julien Oculi 2025-05-14 10:16:06 +02:00
parent 171655bb08
commit 0214f587a5

View file

@ -40,19 +40,19 @@ export default function IsOnline(
return <>{displayed}</>
}
function openSocket(status: Signal<boolean>) {
function openSocket(status: Signal<boolean>, timeout = 5_000) {
const socket = new WebSocket(
`wss://${location.host}/api/serviceworker/is-online`,
)
socket.addEventListener('open', () => {
status.value = true
const id = Number(sessionStorage.getItem('$cohabit.is-online.id') ?? -1)
clearInterval(id)
})
setTimeout(() => {
if (socket.OPEN || socket.CONNECTING) return
socket.close()
}, timeout)
socket.addEventListener('open', () => status.value = true)
socket.addEventListener('close', () => {
status.value = false
// Try reconnect every 5s
const id = setInterval(() => openSocket(status), 5_000)
sessionStorage.setItem('$cohabit.is-online.id', id.toString())
setTimeout(() => openSocket(status), timeout)
})
}