mirror of
				https://github.com/Brandon-Rozek/website-theme.git
				synced 2025-11-04 03:21:13 +00:00 
			
		
		
		
	Modernizing service worker
This commit is contained in:
		
							parent
							
								
									5e1ec3f213
								
							
						
					
					
						commit
						b84102ea4b
					
				
					 1 changed files with 76 additions and 54 deletions
				
			
		| 
						 | 
					@ -4,34 +4,60 @@ let offlinePage = '/offline';
 | 
				
			||||||
let offlineFundamentals = [offlinePage, '/'];
 | 
					let offlineFundamentals = [offlinePage, '/'];
 | 
				
			||||||
let maxItems = 100;
 | 
					let maxItems = 100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
self.addEventListener('install', function (event) {
 | 
					
 | 
				
			||||||
	// Cache offline fundamentals
 | 
					function addFundamentals() {
 | 
				
			||||||
	event.waitUntil(
 | 
					  return caches.open(version + cacheName)
 | 
				
			||||||
    caches.open(version + cacheName).then(function (cache) {
 | 
					  .then(cache => cache.addAll(offlineFundamentals))
 | 
				
			||||||
        return cache.addAll(offlineFundamentals);
 | 
					}
 | 
				
			||||||
	}));
 | 
					
 | 
				
			||||||
});
 | 
					// Cache the page(s) that initiate the service worker
 | 
				
			||||||
 | 
					function cacheClients() {
 | 
				
			||||||
 | 
					  return clients.matchAll({
 | 
				
			||||||
 | 
					      includeUncontrolled: true
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  .then(allClients => allClients.map(client => client.url))
 | 
				
			||||||
 | 
					  .then(pages => [pages, caches.open(cacheName)])
 | 
				
			||||||
 | 
					  .then(([pages, cache]) => cache.addAll(pages))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Remove caches whose name is no longer valid
 | 
				
			||||||
 | 
					function clearInvalidatedCaches() {
 | 
				
			||||||
 | 
					  return caches.keys()
 | 
				
			||||||
 | 
					  .then( keys => {
 | 
				
			||||||
 | 
					      return Promise.all(keys
 | 
				
			||||||
 | 
					        .filter(key => !key.includes(version))
 | 
				
			||||||
 | 
					        .map(key => caches.delete(key))
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function trimCache(name, maxItems) {
 | 
					function trimCache(name, maxItems) {
 | 
				
			||||||
  caches.open(name).then(function(cache) {
 | 
					  return caches.open(name)
 | 
				
			||||||
    cache.keys().then(function(keys) {
 | 
					  .then(cache => [cache, cache.keys()])
 | 
				
			||||||
  // Make sure offlineFundamentals don't get deleted
 | 
					  // Make sure offlineFundamentals don't get deleted
 | 
				
			||||||
      possibleDelete = keys.filter(function(key) {
 | 
					  .then(([cache, keys]) => [cache, keys.filter(key => !offlineFundamentals.includes(key))])
 | 
				
			||||||
        !offlineFundamentals.includes(key)
 | 
					  .then(([cache, possibleDelete]) => {
 | 
				
			||||||
      });
 | 
					    // Trim cache until we are of the right size
 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Keep track of each delete
 | 
					 | 
				
			||||||
    deleteInProgress = []
 | 
					    deleteInProgress = []
 | 
				
			||||||
    for (let i = 0; i < keys.length - maxItems; i++) {
 | 
					    for (let i = 0; i < keys.length - maxItems; i++) {
 | 
				
			||||||
 | 
					      // Keep track of each delete
 | 
				
			||||||
      deleteInProgress.push(cache.delete(possibleDelete[i]));
 | 
					      deleteInProgress.push(cache.delete(possibleDelete[i]));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Return when everything is resolved
 | 
					    // Return when everything is resolved
 | 
				
			||||||
    return Promise.all(deleteInProgress);
 | 
					    return Promise.all(deleteInProgress);
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					self.addEventListener('install', function (event) {
 | 
				
			||||||
 | 
						// Cache offline fundamentals
 | 
				
			||||||
 | 
						event.waitUntil(
 | 
				
			||||||
 | 
					    addFundamentals()
 | 
				
			||||||
 | 
					    .then(() => cacheClients())
 | 
				
			||||||
 | 
					    .then(() => skipWaiting())
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Listens for trimCache command which occurs on page load
 | 
					// Listens for trimCache command which occurs on page load
 | 
				
			||||||
self.addEventListener('message', event => {
 | 
					self.addEventListener('message', event => {
 | 
				
			||||||
  if (event.data.command == 'trimCache') {
 | 
					  if (event.data.command == 'trimCache') {
 | 
				
			||||||
| 
						 | 
					@ -42,32 +68,28 @@ self.addEventListener('message', event => {
 | 
				
			||||||
// If the version changes, invalidate the cache
 | 
					// If the version changes, invalidate the cache
 | 
				
			||||||
self.addEventListener('activate', function (event) {
 | 
					self.addEventListener('activate', function (event) {
 | 
				
			||||||
  event.waitUntil(
 | 
					  event.waitUntil(
 | 
				
			||||||
    caches.keys()
 | 
					    clearInvalidatedCaches()
 | 
				
			||||||
      .then(function (keys) {
 | 
					    .then(() => clients.claim())
 | 
				
			||||||
        return Promise.all(keys
 | 
					 | 
				
			||||||
          // Find all caches that aren't the current version
 | 
					 | 
				
			||||||
          .filter(function (key) {
 | 
					 | 
				
			||||||
            return !key.includes(version)
 | 
					 | 
				
			||||||
          })
 | 
					 | 
				
			||||||
          // Delete the cache
 | 
					 | 
				
			||||||
          .map(function (key) {
 | 
					 | 
				
			||||||
            return caches.delete(key);
 | 
					 | 
				
			||||||
          })
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (registration.navigationPreload) {
 | 
				
			||||||
 | 
					  addEventListener('activate', event => {
 | 
				
			||||||
 | 
					      event.waitUntil(
 | 
				
			||||||
 | 
					          registration.navigationPreload.enable()
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Listen for request events
 | 
					// Listen for request events
 | 
				
			||||||
self.addEventListener('fetch', function (event) {
 | 
					self.addEventListener('fetch', function (event) {
 | 
				
			||||||
	let request = event.request;
 | 
						const request = event.request;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Always fetch non-GET requests from the network
 | 
					  // Always fetch non-GET requests from the network
 | 
				
			||||||
  if (request.method !== 'GET') {
 | 
					  if (request.method !== 'GET') {
 | 
				
			||||||
    event.respondWith(fetch(request)
 | 
					    event.respondWith(
 | 
				
			||||||
      .catch(function () {
 | 
					      fetch(request)
 | 
				
			||||||
        return caches.match(offlinePage);
 | 
					      .catch(() => caches.match(offlinePage))
 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -81,26 +103,26 @@ self.addEventListener('fetch', function (event) {
 | 
				
			||||||
	// Network-first Approach
 | 
						// Network-first Approach
 | 
				
			||||||
	event.respondWith(
 | 
						event.respondWith(
 | 
				
			||||||
    // Attepmt to grab the latest copy from the network
 | 
					    // Attepmt to grab the latest copy from the network
 | 
				
			||||||
		fetch(request).then(function (response) {
 | 
					    Promise.resolve(event.preloadResponse)
 | 
				
			||||||
 | 
					    .then(preloadResponse => preloadResponse || fetch(request))
 | 
				
			||||||
 | 
					    .then(response => {
 | 
				
			||||||
			// If successful, create a copy of the response
 | 
								// If successful, create a copy of the response
 | 
				
			||||||
      // and save it to the cache
 | 
					      // and save it to the cache
 | 
				
			||||||
      // Note: Ignore badges
 | 
					      // Note: Ignore badges
 | 
				
			||||||
      if (!request.url.includes("/badges")) {
 | 
					      if (!request.url.includes("/badges")) {
 | 
				
			||||||
        let cacheCopy = response.clone();
 | 
					        let cacheCopy = response.clone();
 | 
				
			||||||
        event.waitUntil(caches.open(version + cacheName).then(function (cache) {
 | 
					        event.waitUntil(
 | 
				
			||||||
          return cache.put(request, cacheCopy);
 | 
					          caches.open(version + cacheName)
 | 
				
			||||||
        }));
 | 
					          .then(cache => cache.put(request, cacheCopy))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
			return response;
 | 
								return response;
 | 
				
			||||||
		}).catch(function (error) {
 | 
					 | 
				
			||||||
      // Otherwise, check the cache.
 | 
					 | 
				
			||||||
      return caches.match(request).then(function (response) {
 | 
					 | 
				
			||||||
        // Show offline page if cache misses for HTML pages.
 | 
					 | 
				
			||||||
        if (isRequestType('text/html')) {
 | 
					 | 
				
			||||||
          return response || caches.match(offlinePage);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return response;
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					    // Check the cache
 | 
				
			||||||
 | 
					    .catch(error =>
 | 
				
			||||||
 | 
					      caches.match(request)
 | 
				
			||||||
 | 
					      // Show offline page for HTML pages if cache miss
 | 
				
			||||||
 | 
					      .then(response => isRequestType('text/html')? response || caches.match(offlinePage) : response)
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue