summaryrefslogtreecommitdiff
path: root/serviceworker.js
diff options
context:
space:
mode:
Diffstat (limited to 'serviceworker.js')
-rw-r--r--serviceworker.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/serviceworker.js b/serviceworker.js
new file mode 100644
index 0000000..3fc0daf
--- /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 = 'pizza-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);
+ }));
+});