mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
hot fix #1
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
/* eslint-disable no-restricted-globals */
|
||||
// Service Worker for PWA support and offline functionality
|
||||
|
||||
const CACHE_VERSION = 'v1.0.1';
|
||||
const CACHE_VERSION = 'v1.0.2';
|
||||
const CACHE_NAME = `fotbal-club-cache-${CACHE_VERSION}`;
|
||||
|
||||
// Rate limiting for background updates
|
||||
const BACKGROUND_UPDATE_INTERVAL = 5000; // 5 seconds minimum between updates
|
||||
const lastBackgroundUpdates = new Map();
|
||||
|
||||
// Assets to cache on install
|
||||
const STATIC_ASSETS = [
|
||||
'/',
|
||||
@@ -84,6 +88,11 @@ self.addEventListener('fetch', (event) => {
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip background update requests to prevent infinite loops
|
||||
if (request.headers.get('X-SW-Background-Update') === 'true') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle SPA navigations with app shell fallback
|
||||
if (request.mode === 'navigate') {
|
||||
event.respondWith(handleNavigationRequest(request));
|
||||
@@ -106,8 +115,16 @@ async function handleStaticRequest(request) {
|
||||
// Try cache first
|
||||
const cachedResponse = await caches.match(request);
|
||||
if (cachedResponse) {
|
||||
// Return cached response and update in background
|
||||
fetchAndUpdateCache(request);
|
||||
// For static assets with long cache headers, don't update in background
|
||||
const url = new URL(request.url);
|
||||
const isStaticAsset = url.pathname.match(/\.(png|jpg|jpeg|gif|svg|webp|ico|woff|woff2|ttf|eot)$/);
|
||||
const hasLongCache = cachedResponse.headers.get('cache-control')?.includes('max-age=31536000');
|
||||
|
||||
// Only update in background if it's not a static asset with long cache
|
||||
if (!isStaticAsset || !hasLongCache) {
|
||||
fetchAndUpdateCache(request);
|
||||
}
|
||||
|
||||
return cachedResponse;
|
||||
}
|
||||
|
||||
@@ -198,9 +215,28 @@ async function handleAPIRequest(request) {
|
||||
// Update cache in background
|
||||
async function fetchAndUpdateCache(request) {
|
||||
try {
|
||||
const response = await fetch(request);
|
||||
// Skip if this is already a background update request to prevent infinite loops
|
||||
if (request.headers.get('X-SW-Background-Update') === 'true') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Rate limit background updates to prevent excessive requests
|
||||
const now = Date.now();
|
||||
const lastUpdate = lastBackgroundUpdates.get(request.url);
|
||||
if (lastUpdate && (now - lastUpdate) < BACKGROUND_UPDATE_INTERVAL) {
|
||||
return;
|
||||
}
|
||||
lastBackgroundUpdates.set(request.url, now);
|
||||
|
||||
// Use fetch with cache: 'no-store' to bypass service worker and avoid infinite loops
|
||||
const response = await fetch(request.url, {
|
||||
cache: 'no-store',
|
||||
headers: { 'X-SW-Background-Update': 'true' }
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const cache = await caches.open(CACHE_NAME);
|
||||
// Use the original request as key, but the new response
|
||||
cache.put(request, response);
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user