#!/usr/bin/env bash # Complète le service worker d'un site assemblé (make site) : en tête de # /sw.js (copie de web/sw.js), écrit la liste de tous les fichiers du # site, à mettre en cache pour le hors ligne, et la version du site, une # empreinte de leur contenu. # # Le navigateur compare sw.js octet par octet à chaque visite : le moindre # fichier modifié change l'empreinte, donc sw.js, ce qui déclenche la mise à # jour du cache. Un site identique garde le même sw.js : rien à # retélécharger. # # Usage : scripts/service-worker.sh build/site set -euo pipefail site="${1:?usage : scripts/service-worker.sh }" cd "$site" [ -f sw.js ] || { echo "$site/sw.js absent" >&2; exit 1; } # Tous les fichiers sauf sw.js, triés pour que l'empreinte soit stable. mapfile -t files < <(find . -type f ! -path ./sw.js | sed 's|^\./||' | LC_ALL=C sort) version="$(sha256sum "${files[@]}" | sha256sum | cut -c1-16)" { echo "// Généré par scripts/service-worker.sh (make site) : ne pas modifier." echo "const VERSION = \"$version\";" echo "const FILES = [" for f in "${files[@]}"; do # Une page index.html est aussi demandée sous le nom de son dossier. case "$f" in index.html) echo ' "./",' ;; */index.html) echo " \"${f%index.html}\"," ;; esac echo " \"$f\"," done echo "];" echo cat sw.js } >sw.js.tmp mv sw.js.tmp sw.js