summaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
authorAlex Shpak <alex-shpak@users.noreply.github.com>2020-04-21 22:35:30 +0200
committerAlex Shpak <alex-shpak@users.noreply.github.com>2020-05-01 13:19:58 +0200
commitc672d64f126178f0facb91204761b1b913743d71 (patch)
treed2de47eeb45c0bb4d76cf7de2c1635f2a7cb07df /assets
parent9c5fc12dd8fba31d6b5ced553d9748ec87dd9474 (diff)
Generate pages list in sw.js
Diffstat (limited to 'assets')
-rw-r--r--assets/sw-register.js3
-rw-r--r--assets/sw.js54
2 files changed, 56 insertions, 1 deletions
diff --git a/assets/sw-register.js b/assets/sw-register.js
index 583532c..0b71f03 100644
--- a/assets/sw-register.js
+++ b/assets/sw-register.js
@@ -1,6 +1,7 @@
+{{ $swJS := resources.Get "sw.js" | resources.ExecuteAsTemplate "sw.js" . }}
if (navigator.serviceWorker) {
navigator.serviceWorker.register(
- "{{ "/sw.js" | relURL }}",
+ "{{ $swJS.RelPermalink }}",
{ scope: "{{ "/" | relURL }}" }
);
}
diff --git a/assets/sw.js b/assets/sw.js
new file mode 100644
index 0000000..d7d517a
--- /dev/null
+++ b/assets/sw.js
@@ -0,0 +1,54 @@
+const cacheName = self.location.pathname
+const pages = [
+ {{ range .Site.AllPages -}}
+ "{{ .RelPermalink }}",
+ {{ end }}
+];
+
+self.addEventListener("install", function (event) {
+ self.skipWaiting();
+
+ const precache = caches.open(cacheName).then((cache) => {
+ return cache.addAll(pages);
+ });
+ event.waitUntil(precache);
+});
+
+self.addEventListener("fetch", (event) => {
+ const request = event.request;
+ if (request.method !== "GET") {
+ return;
+ }
+
+ /**
+ * @param {Response} response
+ * @returns {Promise<Response>}
+ */
+ function saveToCache(response) {
+ if (cacheable(response)) {
+ return caches
+ .open(cacheName)
+ .then((cache) => cache.put(request, response.clone()))
+ .then(() => response);
+ } else {
+ return response;
+ }
+ }
+
+ /**
+ * @param {Error} error
+ */
+ function serveFromCache(error) {
+ return caches.open(cacheName).then((cache) => cache.match(request.url));
+ }
+
+ /**
+ * @param {Response} response
+ * @returns {Boolean}
+ */
+ function cacheable(response) {
+ return response.type === "basic" && response.ok && !response.headers.has("Content-Disposition")
+ }
+
+ event.respondWith(fetch(request).then(saveToCache).catch(serveFromCache));
+});