Files
ZeasyAlexandClaude Opus 5.5 8be195d938
Paket bauen und veroeffentlichen / paket (push) Failing after 1m21s
Pult: Handy als Stream Deck mit Soundboard und Szenenwechsel
- /pult als installierbare Web-App (Manifest, Service Worker, Symbole)
- Soundboard: Sounds vom Handy hochladen, bearbeiten, im Stream spielen
  ueber die neue Browser-Source /sounds
- Szenen, Clip und Stummschalter: der Stream-PC waehlt sich mit eigenem
  Schluessel beim Hub ein (fern:verbinden), Befehle warten auf OBS
- Browser-Sources melden, welche Seite sie sind

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 11:51:48 +01:00

48 lines
1.9 KiB
JavaScript

/* 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' },
});
});
}));
});