diff options
author | David Yip <yipdw@member.fsf.org> | 2018-03-18 20:20:08 -0500 |
---|---|---|
committer | David Yip <yipdw@member.fsf.org> | 2018-03-18 20:20:08 -0500 |
commit | 6a6f680d98d114e3bb26e414ad7e3787a62bd129 (patch) | |
tree | 002f07d5d5c666c7b5ce47940438e846210f2f5b /app/javascript | |
parent | a387f99659e9a1dde11b6a8f6f3dd5a433b55f45 (diff) | |
parent | f2a9a13b321560828b74a32abbf597727b095f0d (diff) |
Merge remote-tracking branch 'personal/merge/tootsuite/master' into gs-master
Diffstat (limited to 'app/javascript')
-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; + })); } }); |