puzzle/game/WsWrapper.js

63 lines
1.4 KiB
JavaScript
Raw Normal View History

2021-04-14 19:30:45 +02:00
import Time from '../common/Time.js'
2020-11-07 11:35:29 +01:00
/**
* Wrapper around ws that
* - buffers 'send' until a connection is available
* - automatically tries to reconnect on close
*/
export default class WsWrapper {
// actual ws handle
handle = null
// timeout for automatic reconnect
reconnectTimeout = null
// buffer for 'send'
sendBuffer = []
constructor(addr, protocols) {
this.addr = addr
this.protocols = protocols
this.onopen = () => {}
this.onclose = () => {}
this.onmessage = () => {}
}
send (txt) {
if (this.handle) {
this.handle.send(txt)
} else {
this.sendBuffer.push(txt)
}
}
connect() {
let ws = new WebSocket(this.addr, this.protocols)
ws.onopen = (e) => {
if (this.reconnectTimeout) {
clearTimeout(this.reconnectTimeout)
}
this.handle = ws
// should have a queue worker
while (this.sendBuffer.length > 0) {
this.handle.send(this.sendBuffer.shift())
}
this.onopen(e)
}
ws.onmessage = (e) => {
this.onmessage(e)
}
2020-12-03 21:11:52 +01:00
ws.onerror = (e) => {
this.handle = null
2021-04-14 19:30:45 +02:00
this.reconnectTimeout = setTimeout(() => { this.connect() }, 1 * Time.SEC)
2020-12-03 21:11:52 +01:00
this.onclose(e)
}
2020-11-07 11:35:29 +01:00
ws.onclose = (e) => {
this.handle = null
2021-04-14 19:30:45 +02:00
this.reconnectTimeout = setTimeout(() => { this.connect() }, 1 * Time.SEC)
2020-11-07 11:35:29 +01:00
this.onclose(e)
}
}
}