summaryrefslogtreecommitdiff
path: root/public/serviceworker.js
diff options
context:
space:
mode:
authorHorus2021-01-14 12:09:21 +0100
committerHorus2021-01-14 12:09:21 +0100
commit983167172a7995acc86c6bd05ea4c268845f1ffe (patch)
tree169054e132b19b21fdef1860f830d176c110d050 /public/serviceworker.js
parent5269a15bcffe0a5084092fc61f445c0bee588baa (diff)
downloadzeitumstellung-983167172a7995acc86c6bd05ea4c268845f1ffe.tar.gz
Reimplement in vanilla PHP.
Diffstat (limited to 'public/serviceworker.js')
-rw-r--r--public/serviceworker.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/public/serviceworker.js b/public/serviceworker.js
new file mode 100644
index 0000000..f21a400
--- /dev/null
+++ b/public/serviceworker.js
@@ -0,0 +1,74 @@
+const filesToCache = [
+ '/ical.php'
+];
+
+var cacheName = 'zeitumstellung-v1';
+var successResponses = /^0|([123]\d\d)|(40[14567])|410$/;
+
+/* https://developers.google.com/web/ilt/pwa/lab-caching-files-with-service-worker */
+self.addEventListener('install', function(event){
+ console.log('Attempting to install service worker and cache static assets');
+ event.waitUntil(
+ caches.open(cacheName)
+ .then(cache => {
+ return cache.addAll(filesToCache);
+ })
+ );
+ console.log('Installed');
+});
+
+self.addEventListener('activate', function(event){
+ console.log('Activate');
+});
+
+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);
+ }));
+});