M app.lua => app.lua +8 -4
@@ 67,9 67,13 @@ router:post("/share-target", function(params)
app.response:redirect("/api/apps/" .. blobstash.app_id .. "/")
end)
-router:get("/service-worker.js", function(params)
- app.response:headers():set("Content-Type", "application/javascript")
- app.response:write('self.addEventListener("fetch", function (event) { event.respondWith(fetch(event.request)); });')
-end)
+function register_js(name)
+ router:get("/" .. name, function(params)
+ app.response:headers():set("Content-Type", "application/javascript")
+ app.response:write(template.render(name, {app_id = blobstash.app_id}))
+ end)
+end
+
+register_js("service-worker.js")
router:run()
A templates/service-worker.js => templates/service-worker.js +39 -0
@@ 0,0 1,39 @@
+const cacheName = 'v1'
+
+self.addEventListener('install', function(event) {
+ event.waitUntil(
+ caches.open(cacheName).then(function(cache) {
+ return cache.addAll([
+ '/api/apps/{{.app_id}}/',
+ '/api/apps/{{.app_id}}/service-worker.js',
+ ]);
+ })
+ );
+});
+
+self.addEventListener('activate', function(event) {
+ event.waitUntil(
+ caches.keys().then(function(cacheNames) {
+ return Promise.all(
+ cacheNames.filter(function(name) {
+ return name != cacheName;
+ }).map(function(name) {
+ return caches.delete(name);
+ })
+ );
+ })
+ );
+});
+
+self.addEventListener('fetch', function(event) {
+ event.respondWith(
+ caches.open(cacheName).then(function(cache) {
+ var fetchPromise = fetch(event.request).then(function(networkResponse) {
+ cache.put(event.request, networkResponse.clone());
+ return networkResponse;
+ }).catch(() => {
+ return cache.match(event.request)
+ });
+ })
+ );
+});