From 0e56f7ce7df9b30eff7e1c09232eb1199700804d Mon Sep 17 00:00:00 2001 From: Pierre Paridans Date: Thu, 24 Sep 2020 12:52:39 +0000 Subject: [PATCH] [FIX] website_event_track: reuse fetch logic for prefetching urls Before this commit, when prefetching urls if one of them fails, the following are dropped. This commit fixes it by handling each url seperately instead of sending all of them to `cache.addAll()`. It also reuse the same logic as the regular FetchEvent for consistency. X-original-commit: 47fdfb8ae73ab79100fb83751ff0f132b4a5c628 Co-authored-by: Olivier Dony --- .../static/src/js/service_worker.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/addons/website_event_track/static/src/js/service_worker.js b/addons/website_event_track/static/src/js/service_worker.js index 4b8772de3c3..c6b6800aacf 100644 --- a/addons/website_event_track/static/src/js/service_worker.js +++ b/addons/website_event_track/static/src/js/service_worker.js @@ -225,7 +225,7 @@ const matchCache = async (request) => { * @param {FetchEvent} param0 * @returns {Promise} */ -const processFetchEvent = async ({ request }) => { +const processFetchRequest = async ({ request }) => { const requestCopy = request.clone(); let response; try { @@ -288,11 +288,17 @@ const processPendingRequests = async () => { */ const prefetchUrls = async (urls = []) => { const cache = await caches.open(cacheName); - let urlsToCache = new Set(urls); - for (let url of urlsToCache) { - (await cache.match(url)) ? urlsToCache.delete(url) : undefined; + const uniqUrls = new Set(urls); + for (let url of uniqUrls) { + if (await cache.match(url)) { + continue; + } + try { + await processFetchRequest({ request: new Request(url) }); + } catch (error) { + console.error(`fail to prefetch ${url} : ${error}`); + } } - return cache.addAll([...urlsToCache]); }; /** @@ -327,7 +333,7 @@ const processMessage = (data) => { }; self.addEventListener("fetch", (event) => { - event.respondWith(processFetchEvent(event)); + event.respondWith(processFetchRequest(event)); }); self.addEventListener("sync", (event) => {