diff options
author | Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp> | 2018-03-18 23:14:38 +0900 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2018-03-18 15:14:38 +0100 |
commit | 721234230c8eb4bc0d1388276e59350103c01577 (patch) | |
tree | 8a7a7bcd129f0618b21b3614e6530b4abba335e4 /app | |
parent | 566ace2d6479c05e51dd8ce24283b8606be631de (diff) |
Synchronize HTML page cache with sessions (#6815)
Diffstat (limited to 'app')
-rw-r--r-- | app/javascript/mastodon/service_worker/entry.js | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js index ad933b95e..8b65f27a3 100644 --- a/app/javascript/mastodon/service_worker/entry.js +++ b/app/javascript/mastodon/service_worker/entry.js @@ -1,5 +1,9 @@ import './web_push_notifications'; +function openCache() { + return caches.open('mastodon-web'); +} + function fetchRoot() { return fetch('/', { credentials: 'include' }); } @@ -7,10 +11,7 @@ function fetchRoot() { // Cause a new version of a registered Service Worker to replace an existing one // that is already installed, and replace the currently active worker on open pages. self.addEventListener('install', function(event) { - const promises = Promise.all([caches.open('mastodon-web'), fetchRoot()]); - const asyncAdd = promises.then(([cache, root]) => cache.put('/', root)); - - event.waitUntil(asyncAdd); + event.waitUntil(Promise.all([openCache(), fetchRoot()]).then(([cache, root]) => cache.put('/', root))); }); self.addEventListener('activate', function(event) { event.waitUntil(self.clients.claim()); @@ -19,12 +20,29 @@ self.addEventListener('fetch', function(event) { const url = new URL(event.request.url); if (url.pathname.startsWith('/web/')) { - event.respondWith(fetchRoot().then(response => { + const asyncResponse = fetchRoot(); + const asyncCache = openCache(); + + event.respondWith(asyncResponse.then(async response => { if (response.ok) { - return response; + const cache = await asyncCache; + await cache.put('/', response); + return response.clone(); } throw null; }).catch(() => caches.match('/'))); + } else if (url.pathname === '/auth/sign_out') { + const asyncResponse = fetch(event.request); + const asyncCache = openCache(); + + event.respondWith(asyncResponse.then(async response => { + if (response.ok || response.type === 'opaqueredirect') { + const cache = await asyncCache; + await cache.delete('/'); + } + + return response; + })); } }); |