123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- /* eslint-disable no-undef */
- /* eslint-disable no-restricted-globals */
- /* eslint-disable max-lines */
- // Workbox RuntimeCaching config: https://developers.google.com/web/tools/workbox/reference-docs/latest/module-workbox-build#.RuntimeCachingEntry
- /**
- * This is a copy of next-pwa's default runtime cache https://github.com/shadowwalker/next-pwa/blob/master/cache.js
- * except for the MP3 config which we are disabling because it seems to be causing an
- * exception for cached MP3 files (at least on Firefox):
- *
- * Failed to load ‘https://download.quranicaudio.com/qdc/{reader}/{readingStyle}/{fileName}.mp3’
- * e.g. "https://download.quranicaudio.com/qdc/saud_ash-shuraym/murattal/005.mp3"
- * A ServiceWorker intercepted the request and encountered an unexpected error.
- */
- module.exports = [
- {
- urlPattern: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,
- handler: 'CacheFirst',
- options: {
- cacheName: 'google-fonts-webfonts',
- expiration: {
- maxEntries: 4,
- maxAgeSeconds: 365 * 24 * 60 * 60, // 365 days
- },
- },
- },
- {
- urlPattern: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'google-fonts-stylesheets',
- expiration: {
- maxEntries: 4,
- maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
- },
- },
- },
- {
- urlPattern: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'static-font-assets',
- expiration: {
- maxEntries: 4,
- maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
- },
- },
- },
- {
- urlPattern: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'static-image-assets',
- expiration: {
- maxEntries: 64,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- {
- urlPattern: /\/_next\/image\?url=.+$/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'next-image',
- expiration: {
- maxEntries: 64,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- // {
- // urlPattern: /^https:\/\/download.quranicaudio.com\/.*.mp3/i,
- // handler: 'CacheFirst',
- // options: {
- // rangeRequests: true,
- // cacheName: 'static-audio-assets',
- // cacheableResponse: {
- // // workbox by default only caches response with 200 HTTP status
- // statuses: [0, 200, 206],
- // },
- // expiration: {
- // maxEntries: 500,
- // maxAgeSeconds: 24 * 60 * 60, // 24 hours
- // },
- // },
- // },
- {
- urlPattern: /\.(?:mp4)$/i,
- handler: 'CacheFirst',
- options: {
- rangeRequests: true,
- cacheName: 'static-video-assets',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- {
- urlPattern: /\.(?:js)$/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'static-js-assets',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- {
- urlPattern: /\.(?:css|less)$/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'static-style-assets',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- {
- urlPattern: /\/_next\/data\/.+\/.+\.json$/i,
- handler: 'StaleWhileRevalidate',
- options: {
- cacheName: 'next-data',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- {
- urlPattern: /\.(?:json|xml|csv)$/i,
- handler: 'NetworkFirst',
- options: {
- cacheName: 'static-data-assets',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- },
- },
- {
- urlPattern: ({ url }) => {
- const isSameOrigin = self.origin === url.origin;
- if (!isSameOrigin) return false;
- const { pathname } = url;
- // Exclude /api/auth/callback/* to fix OAuth workflow in Safari without impact other environment
- // Above route is default for next-auth, you may need to change it if your OAuth workflow has a different callback route
- // Issue: https://github.com/shadowwalker/next-pwa/issues/131#issuecomment-821894809
- if (pathname.startsWith('/api/auth/')) return false;
- if (pathname.startsWith('/api/')) return true;
- return false;
- },
- handler: 'NetworkFirst',
- method: 'GET',
- options: {
- cacheName: 'apis',
- expiration: {
- maxEntries: 16,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- networkTimeoutSeconds: 10, // fall back to cache if api does not response within 10 seconds
- },
- },
- {
- urlPattern: ({ url }) => {
- const isSameOrigin = self.origin === url.origin;
- if (!isSameOrigin) return false;
- const { pathname } = url;
- if (pathname.startsWith('/api/')) return false;
- return true;
- },
- handler: 'NetworkFirst',
- options: {
- cacheName: 'others',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
- },
- networkTimeoutSeconds: 10,
- },
- },
- {
- urlPattern: ({ url }) => {
- const { pathname } = url;
- const isSameOrigin = self.origin === url.origin;
- // cache everything except mp3 files
- return !isSameOrigin && !pathname.endsWith('.mp3');
- },
- handler: 'NetworkFirst',
- options: {
- cacheName: 'cross-origin',
- expiration: {
- maxEntries: 32,
- maxAgeSeconds: 60 * 60, // 1 hour
- },
- networkTimeoutSeconds: 10,
- },
- },
- ];
|