permalink: “/sw.js” layout: null sitemap: false


const version = '{{ site.time | date: '%Y%m%d%H%M%S' }}'; const cacheName = `static::${version}`;

const buildContentBlob = () => {

return [
  {%- for post in site.posts limit: 10 -%}
    "{{ post.url | relative_url }}",
  {%- endfor -%}
  {%- for page in site.pages -%}
    {%- unless page.url contains 'sw.js' or page.url contains '404.html' -%}
      "{{ page.url | relative_url }}",
    {%- endunless -%}
  {%- endfor -%}
    "{{ site.logo | relative_url }}", "{{ site.baseurl }}/assets/default-offline-image.png", "{{ site.baseurl }}/assets/scripts/fetch.js"
]

}

const updateStaticCache = () => {

return caches.open(cacheName).then(cache => {
  return cache.addAll(buildContentBlob());
});

};

const clearOldCache = () => {

return caches.keys().then(keys => {
  // Remove caches whose name is no longer valid.
  return Promise.all(
    keys
      .filter(key => {
        return key !== cacheName;
      })
      .map(key => {
        console.log(`Service Worker: removing cache ${key}`);
        return caches.delete(key);
      })
  );
});

};

self.addEventListener(“install”, event => {

event.waitUntil(
  updateStaticCache().then(() => {
    console.log(`Service Worker: cache updated to version: ${cacheName}`);
  })
);

});

self.addEventListener(“activate”, event => {

event.waitUntil(clearOldCache());

});

self.addEventListener(“fetch”, event => {

let request = event.request;
let url = new URL(request.url);

// Only deal with requests from the same domain.
if (url.origin !== location.origin) {
  return;
}

// Always fetch non-GET requests from the network.
if (request.method !== "GET") {
  event.respondWith(fetch(request));
  return;
}

// Default url returned if page isn't cached
let offlineAsset = "/offline/";

if (request.url.match(/\.(jpe?g|png|gif|svg)$/)) {
  // If url requested is an image and isn't cached, return default offline image
  offlineAsset = "{{ site.baseurl }}/assets/default-offline-image.png";
}

// For all urls request image from network, then fallback to cache, then fallback to offline page
event.respondWith(
  fetch(request).catch(async () => {
    return (await caches.match(request)) || caches.match(offlineAsset);
  })
);
return;

});