From 5ced7f916d94e86e9a7ec164bee56f9a8e3a2a3a Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Mon, 26 May 2025 10:48:43 +0200 Subject: Replace Azure SWA with custom server --- src/frontend/public/sw.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/frontend/public/sw.js (limited to 'src/frontend/public/sw.js') diff --git a/src/frontend/public/sw.js b/src/frontend/public/sw.js new file mode 100644 index 0000000..70ca169 --- /dev/null +++ b/src/frontend/public/sw.js @@ -0,0 +1,51 @@ +const API_CACHE_NAME = 'api-cache-v1' +const API_URL_PATTERN = /\/api\/(GetStopList)/; +const API_MAX_AGE = 24 * 60 * 60 * 1000; // 24 hours + +self.addEventListener('install', (event) => { + event.waitUntil(self.skipWaiting()); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener('fetch', async (event) => { + const url = new URL(event.request.url); + + if (event.request.method !== "GET" || !API_URL_PATTERN.test(url.pathname)) { + return; + } + + event.respondWith(apiCacheFirst(event.request)); +}); + +async function apiCacheFirst(request) { + const cache = await caches.open(API_CACHE_NAME); + const cachedResponse = await cache.match(request); + + if (cachedResponse) { + const age = Date.now() - new Date(cachedResponse.headers.get('date')).getTime(); + if (age < API_MAX_AGE) { + console.debug(`SW: Cache HIT for ${request.url}`); + return cachedResponse; + } + + // Cache is too old, fetch a fresh copy + cache.delete(request); + } + + try { + const netResponse = await fetch(request); + + const responseToCache = netResponse.clone(); + + cache.put(request, responseToCache); + + console.debug(`SW: Cache MISS for ${request.url}`); + + return netResponse; + } catch (error) { + throw error; + } +} \ No newline at end of file -- cgit v1.3