webpack-bootstrap-ui-kit/src/js/types/sw.js

103 lines
3.0 KiB
JavaScript
Raw Normal View History

// caches polyfill because it is not added to native yet!
2022-05-03 20:50:57 +02:00
const CACHE_NAME = `${UINAME}-sw`
const debug = process.env.NODE_ENV === 'development'
const version = `${UIVERSION}-sw`
2022-05-03 20:50:57 +02:00
const log = require('../libs/log')
const caches = require('../../../thirdparty/serviceworker-caches')
if (debug) {
2022-05-03 20:50:57 +02:00
log('SW: debug is on')
log(`SW: CACHE_NAME: ${CACHE_NAME}`)
// log(`SW: appDomain: ${appDomain}`);
// log(`SW: lang: ${lang}`);
}
2022-05-03 20:50:57 +02:00
if (typeof CACHE_NAME !== 'string') {
throw new Error('Cache Name cannot be empty')
}
2022-05-03 20:50:57 +02:00
self.addEventListener('fetch', (event) => {
// skip non-get
2022-05-03 20:50:57 +02:00
if (event.request.method !== 'GET') {
return
}
2022-05-03 20:50:57 +02:00
// Parse the url
const requestURL = new URL(event.request.url)
2022-05-03 20:50:57 +02:00
// Check for our own urls
/* if (requestURL.origin !== location.origin) {
2021-08-09 18:04:04 +02:00
log('SW: skip external ' + event.request.url);
return;
2022-05-03 20:50:57 +02:00
} */
2022-05-03 20:50:57 +02:00
// Skip admin url's
if (
2022-05-03 20:50:57 +02:00
requestURL.pathname.indexOf('admin') >= 0 ||
requestURL.pathname.indexOf('Security') >= 0 ||
requestURL.pathname.indexOf('/dev') >= 0
) {
2022-05-03 20:50:57 +02:00
log(`SW: skip admin ${event.request.url}`)
return
}
2022-05-03 20:50:57 +02:00
// Test for images
/* if (/\.(jpg|jpeg|png|gif|webp)$/.test(requestURL.pathname)) {
2021-08-09 18:04:04 +02:00
log('SW: skip image ' + event.request.url);
//For now we skip images but change this later to maybe some caching and/or an offline fallback
return;
2022-05-03 20:50:57 +02:00
} */
// Clone the request for fetch and cache
// A request is a stream and can be consumed only once.
2022-05-03 20:50:57 +02:00
const fetchRequest = event.request.clone()
const cacheRequest = event.request.clone()
// Respond with content from fetch or cache
event.respondWith(
// Try fetch
fetch(fetchRequest)
2021-08-18 20:51:15 +02:00
// when fetch is successful, we update the cache
.then((response) => {
// A response is a stream and can be consumed only once.
// Because we want the browser to consume the response,
// as well as cache to consume the response, we need to
// clone it so we have 2 streams
2022-05-03 20:50:57 +02:00
const responseToCache = response.clone()
// and update the cache
caches.open(CACHE_NAME).then((cache) => {
// Clone the request again to use it
// as the key for our cache
2022-05-03 20:50:57 +02:00
const cacheSaveRequest = event.request.clone()
cache.put(cacheSaveRequest, responseToCache)
})
// Return the response stream to be consumed by browser
2022-05-03 20:50:57 +02:00
return response
})
2021-08-18 20:51:15 +02:00
// when fetch times out or fails
.catch((err) => {
2022-05-03 20:50:57 +02:00
log('SW: fetch failed')
// Return the promise which
// resolves on a match in cache for the current request
// or rejects if no matches are found
2022-05-03 20:50:57 +02:00
return caches.match(cacheRequest)
2021-08-18 20:51:15 +02:00
})
2022-05-03 20:50:57 +02:00
)
})
// Now we need to clean up resources in the previous versions
// of Service Worker scripts
2022-05-03 20:50:57 +02:00
self.addEventListener('activate', (event) => {
log(`SW: activated: ${version}`)
// Destroy the cache
2022-05-03 20:50:57 +02:00
event.waitUntil(caches.delete(CACHE_NAME))
})
2022-05-03 20:50:57 +02:00
self.addEventListener('install', (e) => {
log(`SW: installing version: ${version}`)
})