-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathservice-worker.published.js
More file actions
59 lines (49 loc) · 2.32 KB
/
service-worker.published.js
File metadata and controls
59 lines (49 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Caution! Be sure you understand the caveats before publishing an application with
// offline support. See https://aka.ms/blazor-offline-considerations
self.importScripts('./service-worker-assets.js')
self.addEventListener('install', event => {
event.waitUntil(onInstall());
})
self.addEventListener('activate', event => {
event.waitUntil(onActivate())
})
self.addEventListener('fetch', event => event.respondWith(onFetch(event)))
const cacheNamePrefix = 'offline-cache-'
const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`
const offlineAssetsInclude = [/\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/]
const offlineAssetsExclude = [/^service-worker\.js$/]
/* eslint-disable-next-line no-unused-vars */
async function onInstall (event) {
console.info('Service worker: Install')
// Fetch and cache all matching items from the assets manifest
const assetsRequests = self.assetsManifest.assets
.filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
.filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
.map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' }))
await caches.open(cacheName)
.then(cache => cache.addAll(assetsRequests))
.then(() => {
return self.skipWaiting()
})
}
/* eslint-disable-next-line no-unused-vars */
async function onActivate (event) {
console.info('Service worker: Activate')
// Delete unused caches
const cacheKeys = await caches.keys()
await Promise.all(cacheKeys
.filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName)
.map(key => caches.delete(key)))
}
async function onFetch (event) {
let cachedResponse = null
if (event.request.method === 'GET') {
// For all navigation requests, try to serve index.html from cache
// If you need some URLs to be server-rendered, edit the following check to exclude those URLs
const shouldServeIndexHtml = event.request.mode === 'navigate'
const request = shouldServeIndexHtml ? 'index.html' : event.request
const cache = await caches.open(cacheName)
cachedResponse = await cache.match(request)
}
return cachedResponse || fetch(event.request)
}