Packages
fermo
0.20.0
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
ONE_SECOND = 1000
constructor(location) {
this.location = location
this.pingTimer = null
this.reconnectTimer = 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.clearReconnectTimer()
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 {
console.debug('fermo-live: onclose non-clean event:', event)
}
this.socket = null
this.startReconnectTimer()
}
this.socket.onerror = error => {
console.error('fermo-live: onerror error:', error)
}
}
subscribe() {
const message = `subscribe:live-reload:${this.location.pathname}?generation=${window.fermoDependenciesGeneration}`
console.debug(`fermo-live: ${message}`)
this.socket.send(message)
}
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
}
}
startReconnectTimer() {
this.clearReconnectTimer()
this.reconnectTimer = window.setTimeout(() => {
console.debug('fermo-live: reconnecting...')
this.initializeWebSocket()
}, this.ONE_SECOND)
}
clearReconnectTimer() {
if (this.reconnectTimer) {
window.clearTimeout(this.reconnectTimer)
this.reconnectTimer = null
}
}
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)