78 lines
1.8 KiB
JavaScript
78 lines
1.8 KiB
JavaScript
|
export class Websocket {
|
||
|
constructor() {//{{{
|
||
|
this.websocket = null
|
||
|
this.websocket_int_ping = null
|
||
|
this.websocket_int_reconnect = null
|
||
|
this.hooks = {
|
||
|
open: [],
|
||
|
message: [],
|
||
|
error: [],
|
||
|
close: [],
|
||
|
}
|
||
|
}//}}}
|
||
|
|
||
|
register(event, fn) {//{{{
|
||
|
this.hooks[event].push(fn)
|
||
|
}//}}}
|
||
|
|
||
|
start() {//{{{
|
||
|
this.connect()
|
||
|
//this.loop()
|
||
|
}//}}}
|
||
|
loop() {//{{{
|
||
|
setInterval(() => {
|
||
|
if (this.websocket === null) {
|
||
|
console.log("websocket loop connect")
|
||
|
this.connect()
|
||
|
}
|
||
|
}, 1000)
|
||
|
}//}}}
|
||
|
|
||
|
connect() {//{{{
|
||
|
const protocol = location.protocol;
|
||
|
const domain = location.hostname;
|
||
|
const port = location.port;
|
||
|
|
||
|
let wsProtocol = 'wss'
|
||
|
if (protocol == 'http:')
|
||
|
wsProtocol = 'ws'
|
||
|
const websocketURI = `${wsProtocol}://${domain}:${port}/_ws`
|
||
|
|
||
|
this.websocket = new WebSocket(websocketURI)
|
||
|
this.websocket.onopen = (evt) => this.open(evt)
|
||
|
this.websocket.onmessage = (evt) => this.message(evt)
|
||
|
this.websocket.onerror = (evt) => this.error(evt)
|
||
|
this.websocket.onclose = (evt) => this.close(evt)
|
||
|
}//}}}
|
||
|
open() {//{{{
|
||
|
this.hooks.open.forEach(fn=>fn())
|
||
|
// A ping interval to implement a rudimentary keep-alive.
|
||
|
}//}}}
|
||
|
close() {//{{{
|
||
|
this.websocket = null
|
||
|
this.hooks.close.forEach(fn=>fn())
|
||
|
}//}}}
|
||
|
error(evt) {//{{{
|
||
|
this.websocket = null;
|
||
|
this.hooks.error.forEach(fn=>fn(evt))
|
||
|
}//}}}
|
||
|
message(evt) {//{{{
|
||
|
const msg = JSON.parse(evt.data)
|
||
|
if (msg.ID == '' && msg.Op == 'css_reload')
|
||
|
this.refreshCSS()
|
||
|
|
||
|
this.hooks.message.forEach(fn=>fn(evt.data))
|
||
|
return
|
||
|
}//}}}
|
||
|
|
||
|
refreshCSS() {//{{{
|
||
|
let links = document.getElementsByTagName('link')
|
||
|
Array.from(links).forEach(l=>{
|
||
|
if (l.rel == 'stylesheet' && !l.hasAttribute('x-no-reload')) {
|
||
|
l.href = l.href.replace(/\?.*/, '') + `?cache=${Date.now()}`
|
||
|
console.log(l.href)
|
||
|
}
|
||
|
})
|
||
|
}//}}}
|
||
|
}
|