summaryrefslogtreecommitdiff
path: root/service-worker.js
diff options
context:
space:
mode:
authorAlexander Kiryukhin <a.kiryukhin@vk.team>2023-02-16 15:13:52 +0300
committerAlexander Kiryukhin <a.kiryukhin@vk.team>2023-02-16 15:13:52 +0300
commit0984eb2a835eb2234bdc61e67039b9e741a0d934 (patch)
tree1bc9d558476aa75cb578a869ca8219481a259089 /service-worker.js
parenta9aa558d547e647d3dcb97fb7219782a44b589b0 (diff)
SW
Diffstat (limited to 'service-worker.js')
-rw-r--r--service-worker.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/service-worker.js b/service-worker.js
new file mode 100644
index 0000000..aaac385
--- /dev/null
+++ b/service-worker.js
@@ -0,0 +1,82 @@
+/*
+Copyright 2015, 2019 Google Inc. All Rights Reserved.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+// Incrementing OFFLINE_VERSION will kick off the install event and force
+// previously cached resources to be updated from the network.
+const OFFLINE_VERSION = 1;
+const CACHE_NAME = 'offline';
+
+const STATIC_URLS = [
+ "/",
+ "/index.html",
+ "/manifest.webmanifest",
+ "/icon-192x192.png",
+ "/icon-256x256.png",
+ "/icon-384x384.png",
+ "/icon-512x512.png"
+];
+
+self.addEventListener('install', (event) => {
+ event.waitUntil((async () => {
+ const cache = await caches.open(CACHE_NAME);
+ await cache.addAll(STATIC_URLS);
+ })());
+});
+
+self.addEventListener('activate', (event) => {
+ event.waitUntil((async () => {
+ // Enable navigation preload if it's supported.
+ // See https://developers.google.com/web/updates/2017/02/navigation-preload
+ if ('navigationPreload' in self.registration) {
+ await self.registration.navigationPreload.enable();
+ }
+ })());
+
+ // Tell the active service worker to take control of the page immediately.
+ self.clients.claim();
+});
+
+self.addEventListener('fetch', (event) => {
+ // We only want to call event.respondWith() if this is a navigation request
+ // for an HTML page.
+ if (event.request.mode === 'navigate') {
+ event.respondWith((async () => {
+ try {
+ // First, try to use the navigation preload response if it's supported.
+ const preloadResponse = await event.preloadResponse;
+ if (preloadResponse) {
+ return preloadResponse;
+ }
+
+ const networkResponse = await fetch(event.request);
+ return networkResponse;
+ } catch (error) {
+ // catch is only triggered if an exception is thrown, which is likely
+ // due to a network error.
+ // If fetch() returns a valid HTTP response with a response code in
+ // the 4xx or 5xx range, the catch() will NOT be called.
+ console.log('Fetch failed; returning offline page instead.', error);
+
+ const cache = await caches.open(CACHE_NAME);
+ const cachedResponse = await cache.match(OFFLINE_URL);
+ return cachedResponse;
+ }
+ })());
+ }
+
+ // If our if() condition is false, then this fetch handler won't intercept the
+ // request. If there are any other fetch handlers registered, they will get a
+ // chance to call event.respondWith(). If no fetch handlers call
+ // event.respondWith(), the request will be handled by the browser as if there
+ // were no service worker involvement.
+}); \ No newline at end of file