forked from udacity/mws-restaurant-stage-1
-
Notifications
You must be signed in to change notification settings - Fork 0
/
service-worker.js
97 lines (94 loc) · 3.17 KB
/
service-worker.js
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
'use strict';
const cacheVersion = 'v6';
const staticCacheName = `resto-rev-cache-${cacheVersion}`;
const imagesCache = `resto-rev-cache-images-${cacheVersion}`;
const imageRegex = new RegExp(/(.*)(\/)(.*)\.(jpg|png|gif)$/);
const toBeCached = [
'/', '/restaurant.html',
'css/styles.css',
'js/main.js',
'js/restaurant_info.js',
'js/libs/idb-promised.js',
'js/idb-manager.js',
'js/dbhelper.js',
'js/service-worker-loader.js',
'leaflet/leaflet.css',
'https://use.fontawesome.com/releases/v5.2.0/webfonts/fa-solid-900.woff2',
'https://use.fontawesome.com/releases/v5.2.0/webfonts/fa-solid-900.woff',
'https://use.fontawesome.com/releases/v5.2.0/webfonts/fa-solid-900.ttf',
'https://use.fontawesome.com/releases/v5.2.0/css/all.css',
'leaflet/leaflet.js'
];
self.addEventListener('fetch', (event) => {
const requestUrl = new URL(event.request.url);
if(requestUrl.origin === location.origin)
{
if (requestUrl.pathname.startsWith('/restaurant.html')) {
event.respondWith(serveFromCache('/restaurant.html'));
return;
}
if (requestUrl.pathname.match(imageRegex)) {
event.respondWith(serveImg(event.request));
return;
}
event.respondWith(serveFromCache(requestUrl.pathname));
return;
}
if(requestUrl.origin.indexOf('use.fontawesome.com') !== -1) {
event.respondWith(serveFromCache(event.request));
return;
}
event.respondWith(handleRemoteFetching(event.request));
});
self.addEventListener('sync', function(event){
console.log('syncing', event.tag);
if(event.tag === 'offline-data')
event.waitUntil(
Promise.all([
IDBManager.sendOfflineReviews().then(() => DBHelper.fetchAndStoreAllReviews()),
IDBManager.sendOfflineFavorite().then(() => DBHelper.fetchRestaurants())
]));
});
function handleRemoteFetching(request){
return caches.match(request).then(res => {
return res || fetch(request);
});
}
function serveFromCache(key) {
return caches.open(staticCacheName).then(cache => {
return cache.match(key).then(res => res || fetch(key).then(fetched => {
cache.put(key, fetched.clone());
return fetched;
}));
});
}
function serveImg(request) {
let key = request.url.replace(/(.*)(\/)(.*)\.(jpg|png|gif)$/, '$3');
return caches.open(imagesCache).then(cache => {
return cache.match(key)
.then(res => {
return res ||
fetch(request).then(res => {
cache.put(key, res.clone());
return res;
})
.catch((err) => console.log(err));
})
.catch(err => console.log(err));
});
}
self.addEventListener('install', function(e) {
self.importScripts('./js/libs/idb-promised.js', './js/dbhelper.js', './js/idb-manager.js');
e.waitUntil(
caches.open(staticCacheName).then(cache => cache.addAll(toBeCached)));
});
self.addEventListener('message', function(event) {
if (event.data.action === 'skipWaiting') self.skipWaiting();
});
self.addEventListener('activate', function (event) {
event.waitUntil(caches.keys()
.then(cachesKeys =>
Promise.all(cachesKeys.filter((name) => name.startsWith('resto-') && !name.endsWith(cacheVersion))
.map(nameToDelete => caches.delete(nameToDelete)))
));
});