File size: 3,768 Bytes
a86ffc9
0eeb37a
 
 
 
 
acb0ec3
 
0eeb37a
 
b1f0a64
0eeb37a
 
 
 
 
 
 
a86ffc9
0eeb37a
 
b1f0a64
0eeb37a
 
 
 
 
 
 
 
 
 
 
 
 
a86ffc9
0eeb37a
 
b1f0a64
0eeb37a
b1f0a64
 
28b130d
b1f0a64
28b130d
 
b1f0a64
 
 
28b130d
0eeb37a
 
 
 
 
 
 
b1f0a64
0eeb37a
 
28b130d
 
 
 
 
 
 
 
b1f0a64
 
 
 
 
 
28b130d
b1f0a64
 
28b130d
 
 
 
 
 
 
 
0eeb37a
 
 
94efc7a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
const CACHE_NAME = 'teplostil-cache-v5'; // Обновляем версию кэша
const URLS_TO_CACHE = [
    '/',
    '/index.html',
    '/style.css',
    '/icon.png',
    '/icon-512x512.png',
    '/manifest.json'
];

// Установка Service Worker и кэширование ресурсов
self.addEventListener('install', (event) => {
    event.waitUntil(
        caches.open(CACHE_NAME).then((cache) => {
            console.log('Opened cache');
            return cache.addAll(URLS_TO_CACHE);
        })
    );
    self.skipWaiting();
});

// Активация и удаление старых кэшей
self.addEventListener('activate', (event) => {
    event.waitUntil(
        caches.keys().then((cacheNames) => {
            return Promise.all(
                cacheNames.map((cacheName) => {
                    if (cacheName !== CACHE_NAME) {
                        console.log('Deleting old cache:', cacheName);
                        return caches.delete(cacheName);
                    }
                })
            );
        })
    );
    self.clients.claim();
});

// Обработка запросов
self.addEventListener('fetch', (event) => {
    const requestUrl = new URL(event.request.url);

    // Пропускаем запросы к внешнему iframe.  Кэшируем их стандартным образом браузера.
    if (requestUrl.origin !== self.location.origin) {
        console.log('Пропускаем внешний запрос (не кэшируем через SW):', requestUrl.href);
        // Используем стандартный fetch, не вмешиваясь.  Браузер сам разберется с кэшированием.
        return;
    }

    // Для навигационных запросов (это запросы к index.html)
    if (event.request.mode === 'navigate') {
        event.respondWith(
            caches.match('/index.html').then((response) => {
                return response || fetch(event.request);
            })
        );
    } else {
        // Для локальных ресурсов используем Cache First
        event.respondWith(
            caches.match(event.request).then((response) => {
                // Возвращаем кэшированный ресурс, если есть.
                if (response) {
                    return response;
                }

                // Если ресурса нет в кэше, делаем сетевой запрос.
                return fetch(event.request).then((networkResponse) => {
                    // Если запрос с нашего origin, кэшируем ответ.
                    if (requestUrl.origin === self.location.origin) {
                        return caches.open(CACHE_NAME).then((cache) => {
                            cache.put(event.request, networkResponse.clone());
                            return networkResponse;
                        });
                    }
                    // Если запрос не с нашего origin, просто возвращаем ответ (не кэшируем в SW).
                    return networkResponse;
                });
            }).catch(error => {
                // Обработка ошибок, если и кэш недоступен, и сеть.
                console.error("Fetch failed:", error);
                // Можно вернуть страницу-заглушку об ошибке.
                return new Response('<h1>Offline</h1><p>Sorry, the content is not available offline.</p>', {
                    headers: { 'Content-Type': 'text/html' }
                });

            })
        );
    }
});