diff options
Diffstat (limited to 'public/sw.js')
| -rw-r--r-- | public/sw.js | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..a1e4d1a --- /dev/null +++ b/public/sw.js @@ -0,0 +1,175 @@ +/** + * Welcome to your Workbox-powered service worker! + * + * You'll need to register this file in your web app and you should + * disable HTTP caching for this file too. + * See https://goo.gl/nhQhGp + * + * The rest of the code is auto-generated. Please don't update this file + * directly; instead, make changes to your Workbox build configuration + * and re-run your build process. + * See https://goo.gl/2aRDsh + */ + +importScripts("workbox-v4.3.1/workbox-sw.js"); +workbox.setConfig({modulePathPrefix: "workbox-v4.3.1"}); + +workbox.core.setCacheNameDetails({prefix: "gatsby-plugin-offline"}); + +workbox.core.skipWaiting(); + +workbox.core.clientsClaim(); + +/** + * The workboxSW.precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ +self.__precacheManifest = [ + { + "url": "framework-9d7199247c4ea55ff463.js" + }, + { + "url": "app-9d6eb0d64c1dfc1dc408.js" + }, + { + "url": "offline-plugin-app-shell-fallback/index.html", + "revision": "a891777303774a337fe15ef1ac2bddd9" + }, + { + "url": "webpack-runtime-016fc6d688e921254335.js" + }, + { + "url": "manifest.webmanifest", + "revision": "bca2baebe6e7bb39d46fca73f6aa97da" + } +].concat(self.__precacheManifest || []); +workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); + +workbox.routing.registerRoute(/(\.js$|\.css$|static\/)/, new workbox.strategies.CacheFirst(), 'GET'); +workbox.routing.registerRoute(/^https?:.*\/page-data\/.*\.json/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); +workbox.routing.registerRoute(/^https?:.*\.(png|jpg|jpeg|webp|avif|svg|gif|tiff|js|woff|woff2|json|css)$/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); +workbox.routing.registerRoute(/^https?:\/\/fonts\.googleapis\.com\/css/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); + +/* global importScripts, workbox, idbKeyval */ +importScripts(`idb-keyval-3.2.0-iife.min.js`) + +const { NavigationRoute } = workbox.routing + +let lastNavigationRequest = null +let offlineShellEnabled = true + +// prefer standard object syntax to support more browsers +const MessageAPI = { + setPathResources: (event, { path, resources }) => { + event.waitUntil(idbKeyval.set(`resources:${path}`, resources)) + }, + + clearPathResources: event => { + event.waitUntil(idbKeyval.clear()) + + // We detected compilation hash mismatch + // we should clear runtime cache as data + // files might be out of sync and we should + // do fresh fetches for them + event.waitUntil( + caches.keys().then(function (keyList) { + return Promise.all( + keyList.map(function (key) { + if (key && key.includes(`runtime`)) { + return caches.delete(key) + } + + return Promise.resolve() + }) + ) + }) + ) + }, + + enableOfflineShell: () => { + offlineShellEnabled = true + }, + + disableOfflineShell: () => { + offlineShellEnabled = false + }, +} + +self.addEventListener(`message`, event => { + const { gatsbyApi: api } = event.data + if (api) MessageAPI[api](event, event.data) +}) + +function handleAPIRequest({ event }) { + const { pathname } = new URL(event.request.url) + + const params = pathname.match(/:(.+)/)[1] + const data = {} + + if (params.includes(`=`)) { + params.split(`&`).forEach(param => { + const [key, val] = param.split(`=`) + data[key] = val + }) + } else { + data.api = params + } + + if (MessageAPI[data.api] !== undefined) { + MessageAPI[data.api]() + } + + if (!data.redirect) { + return new Response() + } + + return new Response(null, { + status: 302, + headers: { + Location: lastNavigationRequest, + }, + }) +} + +const navigationRoute = new NavigationRoute(async ({ event }) => { + // handle API requests separately to normal navigation requests, so do this + // check first + if (event.request.url.match(/\/.gatsby-plugin-offline:.+/)) { + return handleAPIRequest({ event }) + } + + if (!offlineShellEnabled) { + return await fetch(event.request) + } + + lastNavigationRequest = event.request.url + + let { pathname } = new URL(event.request.url) + pathname = pathname.replace(new RegExp(`^`), ``) + + // Check for resources + the app bundle + // The latter may not exist if the SW is updating to a new version + const resources = await idbKeyval.get(`resources:${pathname}`) + if (!resources || !(await caches.match(`/app-9d6eb0d64c1dfc1dc408.js`))) { + return await fetch(event.request) + } + + for (const resource of resources) { + // As soon as we detect a failed resource, fetch the entire page from + // network - that way we won't risk being in an inconsistent state with + // some parts of the page failing. + if (!(await caches.match(resource))) { + return await fetch(event.request) + } + } + + const offlineShell = `/offline-plugin-app-shell-fallback/index.html` + const offlineShellWithKey = workbox.precaching.getCacheKeyForURL(offlineShell) + return await caches.match(offlineShellWithKey) +}) + +workbox.routing.registerRoute(navigationRoute) + +// this route is used when performing a non-navigation request (e.g. fetch) +workbox.routing.registerRoute(/\/.gatsby-plugin-offline:.+/, handleAPIRequest) |
