Skip to content

Commit

Permalink
It's time for Service Workers
Browse files Browse the repository at this point in the history
  • Loading branch information
cheeaun committed Nov 26, 2015
1 parent 23e0a89 commit 19f9caf
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
8 changes: 8 additions & 0 deletions index.html
Expand Up @@ -143,6 +143,14 @@ <h1>About</h1>
ga('send', 'event', 'App', 'Theme', theme);
}, 2000);
})(document, navigator.userAgent);

if ('serviceWorker' in navigator){
navigator.serviceWorker.register('service-worker.js').then(function(registration){
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err){
console.log('ServiceWorker registration failed: ', err);
});
}
</script>
</body>
</html>
63 changes: 63 additions & 0 deletions service-worker.js
@@ -0,0 +1,63 @@
self.addEventListener('install', function(event){
console.log('Install');
});

self.addEventListener('activate', function(event){
console.log('Activate');
});

var cacheName = 'hackerweb-v1';
var successResponses = /^0|([123]\d\d)|(40[14567])|410$/;
var networkTimeoutSeconds = 10;

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);
}));
});

0 comments on commit 19f9caf

Please sign in to comment.