From 468b7e15954df04bff84a99252fc6ced16aa5816 Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Thu, 21 Apr 2022 12:52:42 +0530 Subject: [PATCH] Cache config.json --- src/platform/web/Platform.js | 2 +- src/platform/web/sw.js | 35 ++++++++++++++++++++++++++++++++++- vite.config.js | 5 +++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/platform/web/Platform.js b/src/platform/web/Platform.js index 92608d75..7d5126dc 100644 --- a/src/platform/web/Platform.js +++ b/src/platform/web/Platform.js @@ -171,7 +171,7 @@ export class Platform { if (!this._configURL) { throw new Error("Neither config nor configURL was provided!"); } - const {body}= await this.request(this._configURL, {method: "GET", format: "json"}).response(); + const {body}= await this.request(this._configURL, {method: "GET", format: "json", cache: true}).response(); this._config = body; } this._notificationService = new NotificationService( diff --git a/src/platform/web/sw.js b/src/platform/web/sw.js index c5f69438..e57634fc 100644 --- a/src/platform/web/sw.js +++ b/src/platform/web/sw.js @@ -75,7 +75,14 @@ self.addEventListener('fetch', (event) => { This has to do with xhr not being supported in service workers. */ if (event.request.method === "GET") { - event.respondWith(handleRequest(event.request)); + if (event.request.url.includes("config.json")) { + /** + * Use a different strategy for this file. + */ + event.respondWith(handleConfigRequest(event.request)); + } else { + event.respondWith(handleRequest(event.request)); + } } }); @@ -119,6 +126,32 @@ async function handleRequest(request) { } } +async function handleConfigRequest(request) { + const url = new URL(request.url); + // rewrite / to /index.html so it hits the cache + if (url.origin === baseURL.origin && url.pathname === baseURL.pathname) { + request = new Request(new URL("index.html", baseURL.href)); + } + let response = await readCache(request); + if (response) { + fetchAndUpdateConfig(request); + return response; + } + response = await fetchAndUpdateConfig(request); + return response; +} + +async function fetchAndUpdateConfig(request) { + const response = await fetch(request, { + signal: pendingFetchAbortController.signal, + headers: { + "Cache-Control": "no-cache", + }, + }); + updateCache(request, response.clone()); + return response; +} + async function updateCache(request, response) { // don't write error responses to the cache if (response.status >= 400) { diff --git a/vite.config.js b/vite.config.js index 4dd35af2..87e3d063 100644 --- a/vite.config.js +++ b/vite.config.js @@ -14,6 +14,11 @@ export default defineConfig(({mode}) => { outDir: "../../../target", minify: true, sourcemap: true, + rollupOptions: { + output: { + assetFileNames: (asset) => asset.name.includes("config.json") ? "assets/[name][extname]": "assets/[name].[hash][extname]", + }, + }, }, plugins: [ themeBuilder({