mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-15 02:54:07 +00:00
This persists the current docs page so that it is used on page reload of the app. This is mostly useful for development since users should not be refreshing the page. It also remembers the selected page between sessions, so new windows will open to the previous page. Checks are added to default back to the docs index page in case the "remembered" page is no longer valid.
105 lines
3.6 KiB
TypeScript
105 lines
3.6 KiB
TypeScript
// SPDX-License-Identifier: MIT
|
|
// Copyright (c) 2022 The Pybricks Authors
|
|
|
|
/// <reference lib="webworker" />
|
|
/* eslint-disable no-restricted-globals */
|
|
|
|
// This service worker can be customized!
|
|
// See https://developers.google.com/web/tools/workbox/modules
|
|
// for the list of available Workbox modules, or add any other
|
|
// code you'd like.
|
|
// You can also remove this file if you'd prefer not to use a
|
|
// service worker, and the Workbox build step will be skipped.
|
|
|
|
// istanbul ignore file
|
|
|
|
import { clientsClaim } from 'workbox-core';
|
|
import { createHandlerBoundToURL, precacheAndRoute } from 'workbox-precaching';
|
|
import { registerRoute } from 'workbox-routing';
|
|
import { CacheFirst } from 'workbox-strategies';
|
|
import { docsDefaultPage, docsPathPrefix } from './app/constants';
|
|
|
|
declare const self: ServiceWorkerGlobalScope;
|
|
|
|
clientsClaim();
|
|
|
|
// Precache all of the assets generated by your build process.
|
|
// Their URLs are injected into the manifest variable below.
|
|
// This variable must be present somewhere in your service worker file,
|
|
// even if you decide not to use precaching. See https://cra.link/PWA
|
|
precacheAndRoute(self.__WB_MANIFEST, { ignoreURLParametersMatching: [/.*/] });
|
|
|
|
// Set up App Shell-style routing, so that all navigation requests
|
|
// are fulfilled with your index.html shell. Learn more at
|
|
// https://developers.google.com/web/fundamentals/architecture/app-shell
|
|
const fileExtensionRegexp = new RegExp('/[^/?]+\\.[^/]+$');
|
|
registerRoute(
|
|
// Return false to exempt requests from being fulfilled by index.html.
|
|
({ request, url }) => {
|
|
// If this isn't a navigation, skip.
|
|
if (request.mode !== 'navigate') {
|
|
return false;
|
|
}
|
|
|
|
// If this is a URL for a static resource, skip.
|
|
if (url.pathname.startsWith('/static/')) {
|
|
return false;
|
|
}
|
|
|
|
// If this is a URL that starts with /_, skip.
|
|
if (url.pathname.startsWith('/_')) {
|
|
return false;
|
|
}
|
|
|
|
// If this looks like a URL for a resource, because it contains
|
|
// a file extension, skip.
|
|
if (url.pathname.match(fileExtensionRegexp)) {
|
|
return false;
|
|
}
|
|
|
|
// Return true to signal that we want to use the handler.
|
|
return true;
|
|
},
|
|
createHandlerBoundToURL(process.env.PUBLIC_URL + '/index.html'),
|
|
);
|
|
|
|
// route to fall back to docs index if a bad docs page is requested
|
|
registerRoute(
|
|
// Return false to exempt requests from being fulfilled by index.html.
|
|
({ request, url }) => {
|
|
// If this isn't a navigation, skip.
|
|
if (request.mode !== 'navigate') {
|
|
return false;
|
|
}
|
|
|
|
if (!url.pathname.startsWith(`/${docsPathPrefix}`)) {
|
|
return false;
|
|
}
|
|
|
|
// Return true to signal that we want to use the handler.
|
|
return true;
|
|
},
|
|
createHandlerBoundToURL(`${process.env.PUBLIC_URL}${docsDefaultPage}`),
|
|
);
|
|
|
|
// An example runtime caching route for requests that aren't handled by the
|
|
// precache, in this case same-origin .png requests like those from in public/
|
|
registerRoute(
|
|
// Add in any other file extensions or routing criteria as needed.
|
|
({ request }) => request.destination === 'image',
|
|
// Customize this strategy as needed, e.g., by changing to CacheFirst.
|
|
new CacheFirst({
|
|
cacheName: 'images',
|
|
}),
|
|
);
|
|
|
|
// This allows the web app to trigger skipWaiting via
|
|
// registration.waiting.postMessage({type: 'SKIP_WAITING'})
|
|
self.addEventListener('message', (event) => {
|
|
if (event.data && event.data.type === 'SKIP_WAITING') {
|
|
self.skipWaiting();
|
|
}
|
|
});
|
|
|
|
// Any other custom service worker logic can go here.
|