61 lines
1.3 KiB
TypeScript
61 lines
1.3 KiB
TypeScript
import { delay, requestIdleCallback } from "./Utils"
|
|
import StatusMessage from "./StatusMessage"
|
|
|
|
let etags = new Map<string, string>()
|
|
let hasNewVersion = false
|
|
let newVersionCheckDelay = 60000
|
|
|
|
async function checkNewVersion(url: string, statusMessage: StatusMessage) {
|
|
if(hasNewVersion) {
|
|
return
|
|
}
|
|
|
|
try {
|
|
let headers = {}
|
|
|
|
if(etags.has(url)) {
|
|
headers["If-None-Match"] = etags.get(url)
|
|
}
|
|
|
|
let response = await fetch(url, {
|
|
headers,
|
|
credentials: "omit"
|
|
})
|
|
|
|
// Not modified response
|
|
if(response.status === 304) {
|
|
return
|
|
}
|
|
|
|
if(!response.ok) {
|
|
console.warn("Error fetching", url, response.status)
|
|
return
|
|
}
|
|
|
|
let newETag = response.headers.get("ETag")
|
|
let oldETag = etags.get(url)
|
|
|
|
if(newETag) {
|
|
etags.set(url, newETag)
|
|
}
|
|
|
|
if(oldETag && newETag && oldETag !== newETag) {
|
|
statusMessage.showInfo("A new version of the website is available. Please refresh the page.", -1)
|
|
|
|
// Do not check for new versions again.
|
|
hasNewVersion = true
|
|
return
|
|
}
|
|
} catch(err) {
|
|
console.warn("Error fetching", url + "\n", err)
|
|
} finally {
|
|
checkNewVersionDelayed(url, statusMessage)
|
|
}
|
|
}
|
|
|
|
export function checkNewVersionDelayed(url: string, statusMessage: StatusMessage) {
|
|
return delay(newVersionCheckDelay).then(() => {
|
|
requestIdleCallback(() => checkNewVersion(url, statusMessage))
|
|
})
|
|
}
|