Skip to content

Commit e1ed55e

Browse files
author
Avaer Kazmer
committed
Major refactoring of sw.js requesting to use cache-then-network strategy
1 parent 1722495 commit e1ed55e

File tree

1 file changed

+63
-56
lines changed

1 file changed

+63
-56
lines changed

sw.js

Lines changed: 63 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -162,36 +162,45 @@ self.addEventListener('activate', event => {
162162
// console.log('sw activate');
163163
self.clients.claim();
164164
});
165-
self.addEventListener('fetch', event => {
165+
166+
self.addEventListener('fetch', event => event.respondWith(
167+
168+
(async () => {
166169
// console.log('got request', event.request.url);
167170

168-
const permanentRedirect = permanentRedirects[event.request.url];
169-
if (permanentRedirect) {
170-
event.respondWith(
171-
fetch(permanentRedirect)
172-
);
173-
return;
174-
}
171+
let u = event.request.url;
172+
const dst = redirects.get(u);
173+
if (dst) {
174+
redirects.delete(event.request.url);
175175

176-
if (event.request.method === 'HEAD' && event.request.url === event.request.referrer) {
177-
event.respondWith(new Response('', {
176+
const res = new Response(dst, {
177+
headers: {
178+
'Content-Type': 'text/html',
179+
},
180+
});
181+
return _rewriteResExt(u, u, res.headers, res);
182+
} else if (event.request.method === 'HEAD' && event.request.url === event.request.referrer) {
183+
return new Response('', {
178184
headers: {
179185
'Content-Type': 'text/html',
180186
'Date': new Date().toUTCString(),
181187
},
182-
}));
183-
} else {
184-
let u = event.request.url;
185-
const dst = redirects.get(u);
186-
if (dst) {
187-
redirects.delete(event.request.url);
188-
189-
const res = new Response(dst, {
190-
headers: {
191-
'Content-Type': 'text/html',
192-
},
193-
});
194-
event.respondWith(_rewriteResExt(u, u, res.headers, res));
188+
});
189+
}
190+
191+
if (!cache) {
192+
cache = await caches.open(cacheName);
193+
}
194+
195+
const cachedRes = await cache.match(event.request);
196+
if (cachedRes) {
197+
return cachedRes;
198+
}
199+
200+
const res = await (() => {
201+
const permanentRedirect = permanentRedirects[event.request.url];
202+
if (permanentRedirect) {
203+
return fetch(permanentRedirect);
195204
} else {
196205
let match = u.match(/^[a-z]+:\/\/[a-zA-Z0-9\-\.:]+(.+)$/);
197206
if (match) {
@@ -200,51 +209,49 @@ self.addEventListener('fetch', event => {
200209
const originalUrl = match2[1];
201210
const permanentRedirect = permanentRedirects[originalUrl];
202211
if (permanentRedirect) {
203-
event.respondWith(
204-
fetch(permanentRedirect)
205-
);
212+
return fetch(permanentRedirect);
206213
} else {
207214
const proxyUrl = _rewriteUrlToProxy(originalUrl);
208-
event.respondWith(
209-
fetch(proxyUrl).then(res => {
210-
res.originalUrl = originalUrl;
211-
return _rewriteRes(res);
212-
})
213-
);
215+
return fetch(proxyUrl).then(res => {
216+
res.originalUrl = originalUrl;
217+
return _rewriteRes(res);
218+
});
214219
}
215220
} else if (match2 = match[1].match(/^\/.d\/(.+)$/)) {
216-
event.respondWith(fetch(match2[1]));
221+
return fetch(match2[1]);
217222
} else if (match2 = match[1].match(/^\/.f\/(.+)$/)) {
218-
event.respondWith(
219-
_resolveFollowUrl(match2[1])
220-
.then(u => new Response(u, {
221-
headers: {
222-
'Content-Type': 'text/plain',
223-
},
224-
}))
225-
);
223+
return _resolveFollowUrl(match2[1])
224+
.then(u => new Response(u, {
225+
headers: {
226+
'Content-Type': 'text/plain',
227+
},
228+
}));
226229
} else {
227-
event.respondWith(
228-
fetch(event.request)
229-
.then(res => {
230-
if (res.type === 'opaque') {
231-
const proxyUrl = _rewriteUrlToProxy(u);
232-
return fetch(proxyUrl).then(res => {
233-
res.originalUrl = u;
234-
return _rewriteRes(res);
235-
})
236-
} else {
230+
return fetch(event.request)
231+
.then(res => {
232+
if (res.type === 'opaque') {
233+
const proxyUrl = _rewriteUrlToProxy(u);
234+
return fetch(proxyUrl).then(res => {
237235
res.originalUrl = u;
238236
return _rewriteRes(res);
239-
}
240-
})
241-
);
237+
})
238+
} else {
239+
res.originalUrl = u;
240+
return _rewriteRes(res);
241+
}
242+
});
242243
}
243244
} else {
244-
event.respondWith(new Response('invalid url', {
245+
return Promise.resolve(new Response('invalid url', {
245246
status: 500,
246247
}));
247248
}
248249
}
250+
})();
251+
if (event.request.method !== 'HEAD') {
252+
cache.put(event.request, res.clone());
249253
}
250-
});
254+
return res;
255+
})()
256+
257+
));

0 commit comments

Comments
 (0)