2025.12.31 02:49:47 (cachyos.cmoser.eu)

This commit is contained in:
2025-12-31 02:49:47 +01:00
parent 6243f87732
commit a5722c163b
154 changed files with 35338 additions and 56 deletions

View File

@@ -0,0 +1,28 @@
'use strict'
{
const dataset = document.currentScript.dataset
const workerScriptPath = dataset.workerScriptPath
const eventsPath = dataset.eventsPath
if (!window.SharedWorker) {
console.debug('😭 django-browser-reload cannot work in this browser.')
} else {
const worker = new SharedWorker(workerScriptPath, {
name: 'django-browser-reload'
})
worker.port.addEventListener('message', (event) => {
if (event.data === 'Reload') {
location.reload()
}
})
worker.port.postMessage({
type: 'initialize',
eventsPath
})
worker.port.start()
}
}

View File

@@ -0,0 +1,112 @@
/* eslint-env worker */
'use strict'
let eventsPath = null
let port = null
let currentVersionId = null
let eventSource = null
addEventListener('connect', (event) => {
// Only keep one active port, for whichever tab was last loaded.
if (port) {
port.close()
}
port = event.ports[0]
port.addEventListener('message', receiveMessage)
port.start()
})
const receiveMessage = (event) => {
if (event.data.type === 'initialize') {
const givenEventsPath = event.data.eventsPath
if (givenEventsPath !== eventsPath) {
if (eventSource) {
eventSource.close()
}
resetConnectTimeout()
setTimeout(connectToEvents, 0)
}
eventsPath = event.data.eventsPath
}
}
let connectAttempts
let connectTimeoutMs
const resetConnectTimeout = () => {
connectAttempts = 0
connectTimeoutMs = 100
}
resetConnectTimeout()
const bumpConnectTimeout = () => {
connectAttempts++
if (connectTimeoutMs === 100 && connectAttempts === 20) {
connectAttempts = 0
connectTimeoutMs = 300
} else if (connectTimeoutMs === 300 && connectAttempts === 20) {
connectAttempts = 0
connectTimeoutMs = 1000
} else if (connectTimeoutMs === 1000 && connectAttempts === 20) {
connectAttempts = 0
connectTimeoutMs = 3000
} else if (connectAttempts === 100) {
// Give up after 5 minutes.
console.debug(
'😢 django-browser-reload failed to connect after 5 minutes, shutting down.'
)
close()
return
}
if (connectAttempts === 0) {
console.debug(
'😅 django-browser-reload EventSource error, retrying every ' +
connectTimeoutMs +
'ms'
)
}
}
const connectToEvents = () => {
if (!eventsPath) {
setTimeout(connectToEvents, connectTimeoutMs)
return
}
eventSource = new EventSource(eventsPath)
eventSource.addEventListener('open', () => {
console.debug('😎 django-browser-reload connected')
})
eventSource.addEventListener('message', (event) => {
// Reset connection timeout when receiving a message, as its proof that
// we are actually connected.
resetConnectTimeout()
const message = JSON.parse(event.data)
if (message.type === 'ping') {
if (currentVersionId !== null && currentVersionId !== message.versionId) {
console.debug('🔁 django-browser-reload triggering reload.')
port.postMessage('Reload')
}
currentVersionId = message.versionId
} else if (message.type === 'reload') {
port.postMessage('Reload')
}
})
eventSource.addEventListener('error', () => {
eventSource.close()
eventSource = null
bumpConnectTimeout()
setTimeout(connectToEvents, connectTimeoutMs)
})
}