/* Service Worker fuer das Pult. * * Er macht genau zwei Dinge: er ist da, damit sich das Pult als App * installieren laesst, und er haelt die Huelle des Pults vor, damit es ohne * Netz wenigstens aufgeht und "keine Verbindung" sagen kann statt einer * leeren Fehlerseite des Browsers. * * Immer zuerst das Netz: nach dem Ausrollen soll sofort die neue Fassung * laufen, nicht die aus dem Speicher. Alles, was nicht auf der Liste steht - * Ereignisstrom, Knoepfe, Sounds, die Browser-Sources fuer OBS -, fasst er * nicht an. Ein Pult, das einen Szenenwechsel aus dem Speicher beantwortet, * waere schlimmer als gar keins. */ var SPEICHER = 'pult-v1'; var HUELLE = ['/pult', '/pult.css', '/pult.js', '/manifest.webmanifest', '/icons/pult-192.png', '/icons/apple-touch-icon.png']; self.addEventListener('install', function () { self.skipWaiting(); }); self.addEventListener('activate', function (e) { e.waitUntil(caches.keys().then(function (namen) { return Promise.all(namen.filter(function (n) { return n !== SPEICHER; }) .map(function (n) { return caches.delete(n); })); }).then(function () { return self.clients.claim(); })); }); self.addEventListener('fetch', function (e) { var url = new URL(e.request.url); if (e.request.method !== 'GET' || url.origin !== self.location.origin) return; if (HUELLE.indexOf(url.pathname) === -1) return; e.respondWith(fetch(e.request).then(function (res) { // Nur Gelungenes merken. Die Anmeldeseite (401) gehoert nicht in den // Speicher, sonst steht sie beim naechsten Funkloch statt des Pults da. if (res.ok) { var kopie = res.clone(); caches.open(SPEICHER).then(function (c) { c.put(url.pathname, kopie); }); } return res; }, function () { return caches.match(url.pathname).then(function (r) { return r || new Response('Keine Verbindung zum Hub.', { status: 503, headers: { 'content-type': 'text/plain; charset=utf-8' }, }); }); })); });