diff options
| author | Horus | 2021-01-14 07:55:44 +0100 |
|---|---|---|
| committer | Horus | 2021-01-14 07:55:44 +0100 |
| commit | dc39f3a99af3b31a924e564279aaf0862500bea6 (patch) | |
| tree | 6a384d127337451235b7267f5d06810dac40976b /serviceworker.js | |
| download | untrack-dc39f3a99af3b31a924e564279aaf0862500bea6.tar.gz | |
Initial commit.
Diffstat (limited to 'serviceworker.js')
| -rw-r--r-- | serviceworker.js | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/serviceworker.js b/serviceworker.js new file mode 100644 index 0000000..f765d1c --- /dev/null +++ b/serviceworker.js @@ -0,0 +1,62 @@ +self.addEventListener('install', function(event){ + console.log('Install'); +}); + +self.addEventListener('activate', function(event){ + console.log('Activate'); +}); + +var cacheName = 'untrack-v1'; +var successResponses = /^0|([123]\d\d)|(40[14567])|410$/; + +function fetchAndCache(request){ + console.log('fetchAndCache', request.url); + return fetch(request.clone()).then(function(response){ + console.log(request.method, request.url, response.status, response.type); + if (request.method == 'GET' && response && successResponses.test(response.status) && response.type == 'basic'){ + console.log('Cache', request.url); + caches.open(cacheName).then(function(cache){ + cache.put(request, response); + }); + } + return response.clone(); + }); +}; + +function cacheOnly(request){ + console.log('cacheOnly', request.url); + return caches.open(cacheName).then(function(cache){ + return cache.match(request); + }); +}; + +// Fastest strategy from https://github.com/GoogleChrome/sw-toolbox +self.addEventListener('fetch', function(event){ + var request = event.request; + var url = request.url; + console.log('Fetch', url); + event.respondWith(new Promise(function(resolve, reject){ + var rejected = false; + var reasons = []; + + var maybeReject = function(reason){ + reasons.push(reason.toString()); + if (rejected){ + reject(new Error('Both cache and network failed: "' + reasons.join('", "') + '"')); + } else { + rejected = true; + } + }; + + var maybeResolve = function(result){ + if (result instanceof Response){ + resolve(result); + } else { + maybeReject('No result returned'); + } + }; + + fetchAndCache(request.clone()).then(maybeResolve, maybeReject); + cacheOnly(request).then(maybeResolve, maybeReject); + })); +}); |
