From 571c27a64e8452a58a05d85bf40e1d7885d2dd1b Mon Sep 17 00:00:00 2001 From: sijanec Date: Mon, 8 Jun 2020 22:43:11 +0200 Subject: added update mechanism, DO NOT MERGE b4 seeing commit notes! this "update mechanism" only deletes old caches. old means caches that are caches with names other than the name in cache_name.txt. It is important not to cache cache_name.txt and always serve it with HTTP headers that allow no HTTP level caching. Update checking occurs every 300 seconds and if a new cache is released and sw.js is not reinstalled, this timer will clear the cache. the old update method did not work since it relied on sw being reloaded often, which is not the case on iPhone devices, where Safari runs almost the whole uptime of the phone and it's not common for people to shut down their precious little iPhones. it worked on android as android is known for killing apps and chrome is no exception. --- assets/root/cache_name.txt.bvr | 2 + assets/root/sw.js.bvr | 235 ++++++++++++++++++++++------------------- 2 files changed, 131 insertions(+), 106 deletions(-) create mode 100644 assets/root/cache_name.txt.bvr (limited to 'assets/root') diff --git a/assets/root/cache_name.txt.bvr b/assets/root/cache_name.txt.bvr new file mode 100644 index 0000000..e3a1ee3 --- /dev/null +++ b/assets/root/cache_name.txt.bvr @@ -0,0 +1,2 @@ +<@?i global@> +///site-static-<@?g app_version@>-<@?u 0 7 ?g latest_commit@>||| diff --git a/assets/root/sw.js.bvr b/assets/root/sw.js.bvr index a44a6fc..1a823d4 100644 --- a/assets/root/sw.js.bvr +++ b/assets/root/sw.js.bvr @@ -6,79 +6,79 @@ const static_cache_name = "site-static-<@?g app_version@>-<@?u 0 7 ?g latest_com // sw.js NE SME BITI CACHAN, ker vsebuje verzijo! const assets = [ - "/css/materialize.min.css", - "/css/fontawesome.min.css", - "/css/materialicons.css", - "/css/styles.css", - "/css/fullcalendar/custom.css", - "/css/fullcalendar/daygrid/main.min.css", - "/css/fullcalendar/core/main.min.css", - "/css/fullcalendar/timegrid/main.min.css", + "/css/materialize.min.css", + "/css/fontawesome.min.css", + "/css/materialicons.css", + "/css/styles.css", + "/css/fullcalendar/custom.css", + "/css/fullcalendar/daygrid/main.min.css", + "/css/fullcalendar/core/main.min.css", + "/css/fullcalendar/timegrid/main.min.css", - "/fonts/fa-solid-900.eot", - "/fonts/fa-solid-900.woff2", - "/fonts/fa-brands-400.woff2", - "/fonts/fa-regular-400.eot", - "/fonts/fa-regular-400.woff2", - "/fonts/fa-brands-400.eot", - "/fonts/materialicons.woff2", + "/fonts/fa-solid-900.eot", + "/fonts/fa-solid-900.woff2", + "/fonts/fa-brands-400.woff2", + "/fonts/fa-regular-400.eot", + "/fonts/fa-regular-400.woff2", + "/fonts/fa-brands-400.eot", + "/fonts/materialicons.woff2", - "/img/avatars/asijanec.png", - "/img/avatars/rstular.png", - "/img/icons/icon_384.png", - "/img/icons/icon_192.png", - "/img/icons/icon_72.png", - "/img/icons/icon_144.png", - "/img/icons/icon_512.png", - "/img/icons/icon_96.png", - "/img/icons/icon_48.png", + "/img/avatars/asijanec.png", + "/img/avatars/rstular.png", + "/img/icons/icon_384.png", + "/img/icons/icon_192.png", + "/img/icons/icon_72.png", + "/img/icons/icon_144.png", + "/img/icons/icon_512.png", + "/img/icons/icon_96.png", + "/img/icons/icon_48.png", - "/js/timetable.js", - "/js/gradings.js", - "/js/messaging.js", - "/js/privacypolicy.js", - "/js/teachers.js", - "/js/tos.js", - "/js/login.js", - "/js/app.js", - "/js/meals.js", - "/js/settings.js", + "/js/timetable.js", + "/js/gradings.js", + "/js/messaging.js", + "/js/privacypolicy.js", + "/js/teachers.js", + "/js/tos.js", + "/js/login.js", + "/js/app.js", + "/js/meals.js", + "/js/settings.js", "/js/lang/bundle.js", "/js/setup-storage.js", - "/js/lib/materialize.min.js", - "/js/lib/jquery.min.js", - "/js/lib/localforage.min.js", - "/js/lib/xss.js", - "/js/lib/mergedeep.js", + "/js/lib/materialize.min.js", + "/js/lib/jquery.min.js", + "/js/lib/localforage.min.js", + "/js/lib/xss.js", + "/js/lib/mergedeep.js", - "/js/lib/fullcalendar/daygrid/main.min.js", - "/js/lib/fullcalendar/core/main.min.js", - "/js/lib/fullcalendar/timegrid/main.min.js", - "/js/grades.js", - "/js/about.js", - "/js/logout.js", - "/js/initialize.js", - "/js/absences.js", - "/js/changelog.js", + "/js/lib/fullcalendar/daygrid/main.min.js", + "/js/lib/fullcalendar/core/main.min.js", + "/js/lib/fullcalendar/timegrid/main.min.js", + "/js/grades.js", + "/js/about.js", + "/js/logout.js", + "/js/initialize.js", + "/js/absences.js", + "/js/changelog.js", - "/pages/timetable.html", - "/pages/teachers.html", - "/pages/absences.html", - "/pages/about.html", - "/pages/changelog.html", - "/pages/messaging.html", - "/pages/gradings.html", - "/pages/grades.html", - "/pages/privacypolicy.html", - "/pages/tos.html", - "/pages/meals.html", - "/pages/settings.html", + "/pages/timetable.html", + "/pages/teachers.html", + "/pages/absences.html", + "/pages/about.html", + "/pages/changelog.html", + "/pages/messaging.html", + "/pages/gradings.html", + "/pages/grades.html", + "/pages/privacypolicy.html", + "/pages/tos.html", + "/pages/meals.html", + "/pages/settings.html", - "/manifest.json", - "/index.html", - "/login.html", - "/logout.html", + "/manifest.json", + "/index.html", + "/login.html", + "/logout.html", "/favicon.png", "/pages/jitsi.html", "/js/jitsi.js", @@ -93,58 +93,81 @@ const assets = [ importScripts("/js/lib/localforage.min.js"); importScripts("/js/setup-storage.js"); self.addEventListener("install", (evt) => { - // Add localforage.clear() if storage purge is required - evt.waitUntil( - // localforage.clear() - setupStorage() - ); + // Add localforage.clear() if storage purge is required + evt.waitUntil( + // localforage.clear() + setupStorage() + ); - evt.waitUntil( - caches.open(static_cache_name).then((cache) => { - cache.addAll(assets); - }) - ); + evt.waitUntil( + caches.open(static_cache_name).then((cache) => { + cache.addAll(assets); + }) + ); }); // Delete old caches self.addEventListener("activate", evt => { - evt.waitUntil( - caches.keys().then((keys) => { - return Promise.all(keys - .filter(key => key !== static_cache_name) - .map(key => caches.delete(key)) - ); - }) - ); + evt.waitUntil( + caches.keys().then((keys) => { + return Promise.all(keys + .filter(key => key !== static_cache_name) + .map(key => caches.delete(key)) + ); + }) + ); }); self.addEventListener("message", event => { - if (event.data) { - let data = JSON.parse(event.data); // parse the message back to JSON - if (data.action == "addtocache") { // check the action - event.waitUntil( - caches.open(static_cache_name).then(function (cache) { - try { - return cache.add([data.url]); - } - catch (error) { - console.error("[sw.js] error: " + error); - } - }) - ); - } else if (data.action == "deletecaches") { - caches.keys().then(function (names) { - for (let name of names) - console.log("[sw.js] deleting cache named " + name); - caches.delete(name); - }); - } - } + if (event.data) { + let data = JSON.parse(event.data); // parse the message back to JSON + if (data.action == "addtocache") { // check the action + event.waitUntil( + caches.open(static_cache_name).then(function (cache) { + try { + return cache.add([data.url]); + } + catch (error) { + console.error("[sw.js] error: " + error); + } + }) + ); + } else if (data.action == "deletecaches") { + caches.keys().then(function (names) { + for (let name of names) { + console.log("[sw.js] deleting cache named " + name); + caches.delete(name); + } + }); + } else if (data.action.startsWith("checkversion")) { + try { + var names = await caches.keys(); + console.log("[sw.js] checkversion: ***** checkversion v0 for BežiApp ***** hello, world!"); + if(!(data.valid_cache_name == undefined || data.valid_cache_name == null || data.valid_cache_name == "")) { + var valid_cache_name = data.valid_cache_name; + console.log("[sw.js] checkversion: requested version (cachename) " + valid_cache_name); + } else { + var valid_cache_name = static_cache_name; + console.log("[sw.js] checkversion: no version to keep specified, using current "+valid_cache_name+", but that makes no sense to me."); + } + console.log("[sw.js] checkversion: deleting caches that don't match that cache name ..."); + for (let name of names) { + if(valid_cache_name != name) { + caches.delete(name); + console.log("[sw.js] checkversion: done requesting delete of cache " + name); + } + } + console.log("[sw.js] checkversion: done, exiting!"); + } catch (e) { + console.log("[sw.js] checkversion: !!! ERRORS! (caught)"); + } + } + } }); self.addEventListener("fetch", (evt) => { - evt.respondWith(caches.match(evt.request).then((cache_res) => { - return cache_res || fetch(evt.request); - })) + evt.respondWith(caches.match(evt.request).then((cache_res) => { + return cache_res || fetch(evt.request); + })) }); -- cgit v1.2.3 From 0d4d63927cb2b608c65641859bfe43ba6b17b204 Mon Sep 17 00:00:00 2001 From: sijanec Date: Mon, 8 Jun 2020 23:04:24 +0200 Subject: uhhh, didn't even test ): --- assets/root/sw.js.bvr | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) (limited to 'assets/root') diff --git a/assets/root/sw.js.bvr b/assets/root/sw.js.bvr index 1a823d4..45ac9dd 100644 --- a/assets/root/sw.js.bvr +++ b/assets/root/sw.js.bvr @@ -118,6 +118,30 @@ self.addEventListener("activate", evt => { ); }); +async function sw_asynclycheckversion (data) { + try { + var names = await caches.keys(); + console.log("[sw.js] checkversion: ***** checkversion v0 for BežiApp ***** hello, world!"); + if(!(data.valid_cache_name == undefined || data.valid_cache_name == null || data.valid_cache_name == "")) { + var valid_cache_name = data.valid_cache_name; + console.log("[sw.js] checkversion: requested version (cachename) " + valid_cache_name); + } else { + var valid_cache_name = static_cache_name; + console.log("[sw.js] checkversion: no version to keep specified, using current "+valid_cache_name+", but that makes no sense to me."); + } + console.log("[sw.js] checkversion: deleting caches that don't match that cache name ..."); + for (let name of names) { + if(valid_cache_name != name) { + caches.delete(name); + console.log("[sw.js] checkversion: done requesting delete of cache " + name); + } + } + console.log("[sw.js] checkversion: done, exiting!"); + } catch (e) { + console.log("[sw.js] checkversion: !!! ERRORS! (caught)"); + } +} + self.addEventListener("message", event => { if (event.data) { @@ -141,27 +165,7 @@ self.addEventListener("message", event => { } }); } else if (data.action.startsWith("checkversion")) { - try { - var names = await caches.keys(); - console.log("[sw.js] checkversion: ***** checkversion v0 for BežiApp ***** hello, world!"); - if(!(data.valid_cache_name == undefined || data.valid_cache_name == null || data.valid_cache_name == "")) { - var valid_cache_name = data.valid_cache_name; - console.log("[sw.js] checkversion: requested version (cachename) " + valid_cache_name); - } else { - var valid_cache_name = static_cache_name; - console.log("[sw.js] checkversion: no version to keep specified, using current "+valid_cache_name+", but that makes no sense to me."); - } - console.log("[sw.js] checkversion: deleting caches that don't match that cache name ..."); - for (let name of names) { - if(valid_cache_name != name) { - caches.delete(name); - console.log("[sw.js] checkversion: done requesting delete of cache " + name); - } - } - console.log("[sw.js] checkversion: done, exiting!"); - } catch (e) { - console.log("[sw.js] checkversion: !!! ERRORS! (caught)"); - } + sw_asynclycheckversion(data); } } }); -- cgit v1.2.3