fix(islands/IsOnline): avoid concurrent websocket and refactor openSocket
This commit is contained in:
parent
171655bb08
commit
0214f587a5
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue