From 0a320d22f83867d9aa8d9558bd5389d8812344e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=27rysiek=27=20Wo=C5=BAniak?= Date: Sun, 6 Feb 2022 23:06:43 +0000 Subject: [PATCH] service-worker: cleaner handling of config.js (ref. #30) --- service-worker.js | 80 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/service-worker.js b/service-worker.js index ad73e4f..e02dd3c 100644 --- a/service-worker.js +++ b/service-worker.js @@ -140,6 +140,29 @@ let cacheConfigJSON = async (configURL, cresponse) => { } } + +/** + * get config JSON and verify it's valid + * + * cresponse - the Response object to work with + */ +let getConfigJSON = async (cresponse) => { + if (cresponse == undefined) { + self.log('service-worker', 'config.json response is undefined') + return false; + } + if (cresponse.status != 200) { + self.log('service-worker', `config.json response status is not 200: ${cdata.status} ${cdata.statusText})`) + return false; + } + var cdata = await cresponse.clone().json() + if (verifyConfigData(cdata)) { + return cdata; + } + return false; +} + + // flag signifying the SW has been initialized already var initDone = false @@ -159,40 +182,45 @@ let initServiceWorker = async () => { // self.registration.scope contains the scope this service worker is registered for // so it makes sense to pull config from `config.json` file directly under that location try { + // config.json URL var configURL = self.registration.scope + "config.json" - // we need to know if the config was already cached - var wasCached = true - // get the config file, cached or otherwise + + // get the config data from cache var cresponse = await caches.match(configURL) - if (cresponse != undefined) { - self.log('service-worker', `config file retrieved from cache.`) + var cdata = await getConfigJSON(cresponse) + + // did it work? + if (cdata != false) { + // we need to know if the config was already cached + self.log('service-worker', `valid config file retrieved from cache.`) + var wasCached = true + + // cache failed to deliver } else { - self.log('service-worker', `config file not found in cache, fetching.`) - wasCached = false - cresponse = await fetch(configURL) - } - // check for sanity - // TODO: check also after cache retrieval? - if (cresponse.status != 200) { - self.log('service-worker', `failed to fetch config (${cdata.status} ${cdata.statusText}).`) - } else { - // process the data - cdata = await cresponse.clone().json() - // verify the config - if (verifyConfigData(cdata)) { - // merge the config - self.LibResilientConfig = {...self.LibResilientConfig, ...cdata} - self.log('service-worker', 'config loaded.') - // cache the valid config.json - if (!wasCached) { - // was not retrieved from cache? cache, then! - cacheConfigJSON(configURL, cresponse) - } + + // try fetching directly from the main domain + var cresponse = await fetch(configURL) + cdata = await getConfigJSON(cresponse) + + // did that work? + if (cdata != false) { + self.log('service-worker', `config file not found in cache, fetching.`) + var wasCached = false + // cache it, asynchronously + cacheConfigJSON(configURL, cresponse) + } else { + // we ain't got nothing useful -- justs set cdata to an empty object + cdata = {} self.log('service-worker', 'ignoring invalid config, using defaults.') } } + + // merge configs + self.LibResilientConfig = {...self.LibResilientConfig, ...cdata} + self.log('service-worker', 'config loaded.') + } catch (e) { self.log('service-worker', 'config loading failed, using defaults; error:', e) }