Skip to content

Commit 59bd926

Browse files
Merge pull request #390 from schlagmichdoch/fix-sw-updates
Fix service worker updates and speed up updates
2 parents c7b7bad + dbd6321 commit 59bd926

File tree

2 files changed

+67
-40
lines changed

2 files changed

+67
-40
lines changed

public/scripts/localization.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class Localization {
55
Localization.defaultLocale = "en";
66
Localization.supportedLocales = [
77
"ar", "be", "bg", "ca", "cs", "da", "de", "en", "es", "et", "eu", "fa", "fr", "he", "hu", "id", "it", "ja",
8-
"kn", "ko", "nb", "nn", "nl", "pl", "pt-BR", "ro", "ru", "sk", "ta", "tr", "uk", "zh-CN", "zh-HK", "zh-TW"
8+
"kn", "ko", "nb", "nl", "nn", "pl", "pt-BR", "ro", "ru", "sk", "ta", "tr", "uk", "zh-CN", "zh-HK", "zh-TW"
99
];
1010
Localization.supportedLocalesRtl = ["ar", "he"];
1111

public/service-worker.js

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
const cacheVersion = 'v1.11.1';
22
const cacheTitle = `pairdrop-cache-${cacheVersion}`;
3-
const forceFetch = false; // FOR DEVELOPMENT: Set to true to always update assets instead of using cached versions
43
const relativePathsToCache = [
54
'./',
65
'index.html',
76
'manifest.json',
87
'styles/styles-main.css',
98
'styles/styles-deferred.css',
9+
'scripts/browser-tabs-connector.js',
1010
'scripts/localization.js',
1111
'scripts/main.js',
1212
'scripts/network.js',
@@ -28,45 +28,57 @@ const relativePathsToCache = [
2828
'images/android-chrome-512x512.png',
2929
'images/android-chrome-512x512-maskable.png',
3030
'images/apple-touch-icon.png',
31+
'fonts/OpenSans/static/OpenSans-Medium.ttf',
3132
'lang/ar.json',
3233
'lang/be.json',
34+
'lang/bg.json',
3335
'lang/ca.json',
3436
'lang/cs.json',
3537
'lang/da.json',
3638
'lang/de.json',
3739
'lang/en.json',
3840
'lang/es.json',
41+
'lang/et.json',
42+
'lang/eu.json',
43+
'lang/fa.json',
3944
'lang/fr.json',
4045
'lang/he.json',
4146
'lang/hu.json',
4247
'lang/id.json',
4348
'lang/it.json',
4449
'lang/ja.json',
4550
'lang/kn.json',
51+
'lang/ko.json',
4652
'lang/nb.json',
4753
'lang/nl.json',
54+
'lang/nn.json',
4855
'lang/pl.json',
4956
'lang/pt-BR.json',
5057
'lang/ro.json',
5158
'lang/ru.json',
59+
'lang/sk.json',
60+
'lang/ta.json',
5261
'lang/tr.json',
5362
'lang/uk.json',
5463
'lang/zh-CN.json',
64+
'lang/zh-HK.json',
5565
'lang/zh-TW.json'
5666
];
5767
const relativePathsNotToCache = [
5868
'config'
5969
]
6070

6171
self.addEventListener('install', function(event) {
62-
// Perform install steps
72+
// Perform install steps
73+
console.log("Cache files for sw:", cacheVersion);
6374
event.waitUntil(
6475
caches.open(cacheTitle)
6576
.then(function(cache) {
6677
return cache
6778
.addAll(relativePathsToCache)
6879
.then(_ => {
69-
console.log('All files cached.');
80+
console.log('All files cached for sw:', cacheVersion);
81+
self.skipWaiting();
7082
});
7183
})
7284
);
@@ -76,20 +88,25 @@ self.addEventListener('install', function(event) {
7688
const fromNetwork = (request, timeout) =>
7789
new Promise((resolve, reject) => {
7890
const timeoutId = setTimeout(reject, timeout);
79-
fetch(request)
91+
fetch(request, {cache: "no-store"})
8092
.then(response => {
93+
if (response.redirected) {
94+
throw new Error("Fetch is redirect. Abort usage and cache!");
95+
}
96+
8197
clearTimeout(timeoutId);
8298
resolve(response);
8399

100+
// Prevent requests that are in relativePathsNotToCache from being cached
84101
if (doNotCacheRequest(request)) return;
85102

86-
update(request)
103+
updateCache(request)
87104
.then(() => console.log("Cache successfully updated for", request.url))
88-
.catch(reason => console.log("Cache could not be updated for", request.url, "Reason:", reason));
105+
.catch(err => console.log("Cache could not be updated for", request.url, err));
89106
})
90107
.catch(error => {
91108
// Handle any errors that occurred during the fetch
92-
console.error(`Could not fetch ${request.url}. Are you online?`);
109+
console.error(`Could not fetch ${request.url}.`);
93110
reject(error);
94111
});
95112
});
@@ -111,16 +128,16 @@ const doNotCacheRequest = request => {
111128
};
112129

113130
// cache the current page to make it available for offline
114-
const update = request => new Promise((resolve, reject) => {
115-
if (doNotCacheRequest(request)) {
116-
reject("Url is specifically prevented from being cached in the serviceworker.");
117-
return;
118-
}
131+
const updateCache = request => new Promise((resolve, reject) => {
119132
caches
120133
.open(cacheTitle)
121134
.then(cache =>
122135
fetch(request, {cache: "no-store"})
123136
.then(response => {
137+
if (response.redirected) {
138+
throw new Error("Fetch is redirect. Abort usage and cache!");
139+
}
140+
124141
cache
125142
.put(request, response)
126143
.then(() => resolve());
@@ -129,9 +146,10 @@ const update = request => new Promise((resolve, reject) => {
129146
);
130147
});
131148

132-
// general strategy when making a request (eg if online try to fetch it
133-
// from cache, if something fails fetch from network. Update cache everytime files are fetched.
134-
// This way files should only be fetched if cacheVersion is changed
149+
// general strategy when making a request:
150+
// 1. Try to retrieve file from cache
151+
// 2. If cache is not available: Fetch from network and update cache.
152+
// This way, cached files are only updated if the cacheVersion is changed
135153
self.addEventListener('fetch', function(event) {
136154
if (event.request.method === "POST") {
137155
// Requests related to Web Share Target.
@@ -141,39 +159,48 @@ self.addEventListener('fetch', function(event) {
141159
})());
142160
}
143161
else {
144-
// Regular requests not related to Web Share Target.
145-
if (forceFetch) {
146-
event.respondWith(fromNetwork(event.request, 10000));
147-
}
148-
else {
149-
event.respondWith(
150-
fromCache(event.request)
162+
// Regular requests not related to Web Share Target:
163+
// If request is excluded from cache -> respondWith fromNetwork
164+
// else -> try fromCache first
165+
event.respondWith(
166+
doNotCacheRequest(event.request)
167+
? fromNetwork(event.request, 10000)
168+
: fromCache(event.request)
151169
.then(rsp => {
152170
// if fromCache resolves to undefined fetch from network instead
153-
return rsp || fromNetwork(event.request, 10000);
171+
if (!rsp) {
172+
throw new Error("No match found.");
173+
}
174+
return rsp;
154175
})
155-
);
156-
}
176+
.catch(error => {
177+
console.error("Could not retrieve request from cache:", event.request.url, error);
178+
return fromNetwork(event.request, 10000);
179+
})
180+
);
157181
}
158182
});
159183

160184

161185
// on activation, we clean up the previously registered service workers
162186
self.addEventListener('activate', evt => {
163-
return evt.waitUntil(
164-
caches.keys()
165-
.then(cacheNames => {
166-
return Promise.all(
167-
cacheNames.map(cacheName => {
168-
if (cacheName !== cacheTitle) {
169-
return caches.delete(cacheName);
170-
}
171-
})
172-
);
173-
})
174-
)
175-
}
176-
);
187+
console.log("Activate sw:", cacheVersion);
188+
evt.waitUntil(clients.claim());
189+
return evt.waitUntil(
190+
caches
191+
.keys()
192+
.then(cacheNames => {
193+
return Promise.all(
194+
cacheNames.map(cacheName => {
195+
if (cacheName !== cacheTitle) {
196+
console.log("Delete cache:", cacheName);
197+
return caches.delete(cacheName);
198+
}
199+
})
200+
);
201+
})
202+
)
203+
});
177204

178205
const evaluateRequestData = function (request) {
179206
return new Promise(async (resolve) => {

0 commit comments

Comments
 (0)