73 lines
1.6 KiB
JavaScript
73 lines
1.6 KiB
JavaScript
import { getETag, getETagAndData } from './utils/ajax'
|
|
import { jsonChecksum } from './utils/jsonChecksum'
|
|
import { hasData, loadData } from './idbInterface'
|
|
|
|
export async function checkForUpdates (db, dataSource, signal) {
|
|
// just do a simple HEAD request first to see if the eTags match
|
|
let emojiData
|
|
let eTag = await getETag(dataSource)
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers
|
|
const eTagAndData = await getETagAndData(dataSource)
|
|
eTag = eTagAndData[0]
|
|
emojiData = eTagAndData[1]
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
if (!eTag) {
|
|
eTag = await jsonChecksum(emojiData)
|
|
}
|
|
}
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
if (await hasData(db, dataSource, eTag)) {
|
|
console.log('Database already populated')
|
|
} else {
|
|
console.log('Database update available')
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
if (!emojiData) {
|
|
const eTagAndData = await getETagAndData(dataSource)
|
|
emojiData = eTagAndData[1]
|
|
}
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
await loadData(db, emojiData, dataSource, eTag)
|
|
}
|
|
}
|
|
|
|
export async function loadDataForFirstTime (db, dataSource, signal) {
|
|
let [eTag, emojiData] = await getETagAndData(dataSource)
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
if (!eTag) {
|
|
// Handle lack of support for ETag or Access-Control-Expose-Headers
|
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility
|
|
eTag = await jsonChecksum(emojiData)
|
|
}
|
|
|
|
if (signal.aborted) {
|
|
return
|
|
}
|
|
|
|
await loadData(db, emojiData, dataSource, eTag)
|
|
}
|