From 060286685753278c3b8324d286f9eb48c1b5edfa Mon Sep 17 00:00:00 2001 From: Nayeem Rahman <muhammed.rahman17@imperial.ac.uk> Date: Thu, 10 Oct 2019 15:49:53 +0100 Subject: [PATCH] Add a service worker, manifest and logo --- public/index.html | 16 ++++++++++ public/logo.png | Bin 0 -> 2047 bytes public/manifest.json | 13 ++++++++ public/service-worker.js | 66 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 public/logo.png create mode 100644 public/manifest.json create mode 100644 public/service-worker.js diff --git a/public/index.html b/public/index.html index 4f47abd..369b33f 100644 --- a/public/index.html +++ b/public/index.html @@ -2,6 +2,22 @@ <html lang="en"> <head> <meta charset="UTF-8" /> + <link rel="manifest" href="manifest.json"> + <link rel="shortcut icon" href="logo.png"> + <script> + if (navigator.serviceWorker) { + navigator.serviceWorker + .register("service-worker.js") + .then( + (registration) => + console.log( + `Service worker registered on scope ${registration.scope}`, + ), + (reason) => + console.log(`Service worker failed to register ~ ${reason}`), + ) + } + </script> </head> <body> <div> diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4266dca24a4059dcb0a7eec22db9384378d0bf3 GIT binary patch literal 2047 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 literal 0 HcmV?d00001 diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..1b94f0d --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,13 @@ +{ + "short_name": "Drawing App", + "name": "Drawing App", + "icons": [ + { + "src": "/logo.png", + "type": "image/png", + "sizes": "144x144" + } + ], + "display": "standalone", + "start_url": "/index.html" +} diff --git a/public/service-worker.js b/public/service-worker.js new file mode 100644 index 0000000..006388a --- /dev/null +++ b/public/service-worker.js @@ -0,0 +1,66 @@ +self.addEventListener("install", (event) => { + console.info("Service worker installed.", event) +}) + +self.addEventListener("activate", (event) => { + console.info("Service worker activated.", event) +}) + +const CACHE_NAME = "APP-V0" +const FILES_TO_CACHE = [ + "/index.html", + "/js/app.js", + "/manifest.json", +] +const FILE_ALIASES = new Map([ + ["/", "/index.html"] +]) + +const normalizeUrl = (url) => { + const url_ = new URL(url) + url_.pathname = url_.pathname.replace(/\/+/g, "/").replace(/\/$/, "") + if (FILE_ALIASES.has(url_.pathname)) { + url_.pathname = FILE_ALIASES.get(url_.pathname) + } + return url_.href +} + +self.addEventListener("install", async (event) => { + const cache = await caches.open(CACHE_NAME) + const additions = cache.addAll(FILES_TO_CACHE) + await additions + console.info(`Files cached: [\n ${FILES_TO_CACHE.join(`,\n `)}\n]`) +}) + +self.addEventListener("activate", async (event) => { + const oldCacheKeys = (await caches.keys()).filter((key) => key != CACHE_NAME) + oldCacheKeys.forEach((key) => caches.delete(key)) +}) + + +self.addEventListener("fetch", (event) => { + const normalizedUrl = normalizeUrl(event.request.url) + let response = fetch(event.request) + if (FILES_TO_CACHE.includes(normalizedUrl)) { + response = response + .then(async (response) => { + const cache = await caches.open(CACHE_NAME) + await cache.put(normalizedUrl, response.clone()) + return response + }) + .catch(() => caches.match(normalizedUrl)) + .catch(e => null) + } + event.respondWith( + fetch(event.request) + .then(async (response) => { + if (FILES_TO_CACHE.includes(new URL(normalizedUrl).pathname)) { + const cache = await caches.open(CACHE_NAME) + await cache.put(normalizedUrl, response.clone()) + } + return response + }) + .catch(() => caches.match(normalizedUrl)) + .catch(e => null) + ) +}) -- GitLab