diff options
-rw-r--r-- | public/index.html | 7 | ||||
-rw-r--r-- | public/service-worker.js | 53 |
2 files changed, 60 insertions, 0 deletions
diff --git a/public/index.html b/public/index.html index 090b0d5..0e74a89 100644 --- a/public/index.html +++ b/public/index.html @@ -40,5 +40,12 @@ <body> <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"></div> + <script> + if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('./service-worker.js') + }) + } + </script> </body> </html> diff --git a/public/service-worker.js b/public/service-worker.js new file mode 100644 index 0000000..d2c6b9e --- /dev/null +++ b/public/service-worker.js @@ -0,0 +1,53 @@ +const CACHE_NAME = 'v1.2.4'; // Per-version requests cache +const IMAGES_CACHE_NAME = 'images' // Long-term images cache + +const isS3Url = url => url.includes('amazonaws.com'); + +this.addEventListener('install', event => { + event.waitUntil( + caches.open(CACHE_NAME) + .then(cache => cache.addAll(['index.html'])) + .catch(e => console.log(e)) + ); +}) + +this.addEventListener('fetch', event => { + if (isS3Url(event.request.url)) { + event.respondWith( + caches.open(IMAGES_CACHE_NAME) + .then(cache => cache.match(event.request) + .then(match => match || fetch(event.request) + .then(response => { + cache.put(event.request, response.clone()); + return response; + }) + ) + .catch(e => console.log(`Error ${e}`)) + ) + ); + } else { + event.respondWith( + caches.open(CACHE_NAME) + .then(cache => fetch(event.request) + .then(response => { + cache.put(event.request, response.clone()); + return response; + }) + .catch(() => cache.match(event.request)) + ) + ); + } +}); + +this.addEventListener('activate', event => { + const cacheWhiteList = [CACHE_NAME, IMAGES_CACHE_NAME]; + event.waitUntil( + caches.keys() + .then(keys => Promise.all( + keys.map(key => { + if (cacheWhiteList.indexOf(key) === -1) return caches.delete(key); + }) + )) + ); +}); + |