Packages
fermo
0.19.2
0.20.1
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.4
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A static site generator
Current section
Files
Jump to
Current section
Files
priv/static/fermo-live.js
class FermoLiveSocket {
PING_INTERVAL = 10000 // 10 seconds
constructor(location) {
this.location = location
this.pingTimer = null
this.initializeWebSocket()
}
rebuild() {
console.debug(`fermo-live: rebuild:${this.location.pathname}`)
this.socket.send('rebuild:' + this.location.pathname)
}
reloadPage() {
this.location.reload()
}
// Below are private methods
initializeWebSocket() {
this.socket = new window.WebSocket(this.socketPath)
this.socket.onopen = e => {
console.debug('fermo-live: socket onopen')
this.subscribe()
this.startPing()
}
this.socket.onmessage = (event) => {
console.debug('fermo-live: onmessage: ', event)
if (event.data === 'reload') {
this.reloadPage()
}
}
this.socket.onclose = event => {
this.clearPingTimer()
if (event.wasClean) {
console.debug('fermo-live: onclose clean event:', event)
} else {
// TODO: Poll to try to reconnect
console.debug('fermo-live: onclose non-clean event:', event)
}
}
this.socket.onerror = error => {
console.error('fermo-live: onerror error:', error)
}
}
subscribe() {
console.debug('fermo-live: subscribe:live-reload:', this.location.pathname)
this.socket.send('subscribe:live-reload:' + this.location.pathname)
}
startPing() {
this.clearPingTimer()
this.pingTimer = window.setInterval(() => {
this.socket.send(JSON.stringify({event: 'ping'}))
}, this.PING_INTERVAL)
}
clearPingTimer() {
if (this.pingTimer) {
window.clearInterval(this.pingTimer)
this.pingTimer = null
}
}
// Define property getter for socketPath
get socketPath() {
const protocol = this.location.protocol === 'https:' ? 'wss' : 'ws'
return `${protocol}://${this.location.host}/__fermo/ws/live-reload`
}
}
window.fermoLiveSocket = new FermoLiveSocket(window.location)