# Service Worker

Ein Service Worker ist ein Computerprogramm, das im Hintergrund eines Webbrowsers läuft und als Vermittler zwischen der Webanwendung, dem Browser und dem Rechnernetz dient. Es handelt sich um eine Technik im Bereich der Progressive Web Apps (PWAs) und ermöglicht es Webanwendungen beispielsweise, bestimmte Funktionen offline verfügbar zu machen und Push-Benachrichtigungen zu senden.

## Grundlagen

Technisch gesehen ist ein Service Worker ein spezialisierter Web Worker, bietet also eine Möglichkeit, JavaScript unabhängig vom Hauptthread auszuführen. Die Besonderheit des Service Workers besteht darin, dass er bestimmte Dienste für die ihm zugeordneten Seiten übernehmen kann und auch dann aktiv sein kann, wenn der Benutzer keine dieser Seiten aufgerufen hat.
Um einen Missbrauch als Man-in-the-Middle zu verhindern, sind Service Worker nur innerhalb eines sicheren Kontexts erlaubt, also in der Regel nur über HTTPS.
Zum Einsatz wird der Service Worker zunächst über die JavaScript-Funktion navigator.serviceWorker.register registriert. Dabei kann angegeben werden, ob der Service Worker für alle Seiten der aktuellen Domain gelten soll oder nur für solche, die sich in einem bestimmten Pfad befinden. Der Browser wird die angegebene Skript-Datei anschließend herunterladen und initialisieren. Sobald dies geschehen ist, steht der Service Worker künftig für alle ihm zugeordneten Seiten bereit. Bereits im Browser geöffnete Seiten müssen zunächst neu geladen werden, bevor sie vom neu eingerichteten Service Worker kontrolliert werden können.
Unabhängig von den angegebenen Einstellungen zum Cache wird der Browser den Service Worker einmal alle 24 Stunden neu herunterladen, sofern eine Internetverbindung besteht. Damit soll vermieden werden, dass ein fehlerhafter Worker dauerhaft im Einsatz bleibt, wenn auch die Angaben zum Cache ungünstig gewählt waren. Liegt eine neue Version vor, so wird diese initialisiert und steht für alle neu aufgerufenen Seiten bereit.

## Einsatzzwecke
### Offline-Nutzung

Der bekannteste Einsatzzweck ist die Offline-Nutzung von Webseiten. Hier löst der Service Worker den Application Cache ab.
Um eine Internetseite mit Hilfe eines Service Workers offline nutzbar zu machen, geht man im einfachsten Fall so vor:
Beim Initialisieren des Workers (dem einzigen Zeitpunkt, zu dem eine Internetverbindung notwendig ist) werden alle benötigten Ressourcen heruntergeladen und gespeichert. Hierzu kann prinzipiell jeder verfügbare Speicher genutzt werden, etwa die Indexed Database API, in der Regel kommt aber ein spezieller Cache-Speicher zum Einsatz, der zwar unabhängig vom gewöhnlichen Browser-Cache ist, aber wie dieser Ressourcen anhand ihrer URL speichert.
Anschließend muss der Service Worker nur auf fetch-Events reagieren. Dieses besondere Ereignis wird immer dann ausgelöst, wenn eine vom Service Worker überwachte Seite eine neue Ressource anfordert. Dies kann durch die Navigation des Benutzers auftreten, nämlich wenn eine aufgerufene Seite weitere Elemente wie Bilder oder Stylesheets einbindet oder wenn mittels AJAX dynamisch Daten geladen werden sollen. Ist die angeforderte Ressource im Cache des Service Workers vorhanden, so kann er sie einfach übergeben; eine Internetverbindung ist dazu nicht notwendig.

### Push-Benachrichtigungen

Ein weiteres Einsatzgebiet für Service Worker sind Push-Benachrichtigungen, also vom Server versandte Benachrichtigungen, die den Benutzer auch dann erreichen sollen, wenn dieser gerade keine entsprechende Seite im Browser geöffnet hat.
Hierzu wird zunächst über dem zum Service Worker gehörenden Push-Manager die Push-Benachrichtigung aktiviert. Dabei wird dem Server, der die Push-Benachrichtigungen versenden soll, eine URL mitgeteilt, an die er die Benachrichtigungen schicken soll. Der Server wird vom jeweiligen Browserhersteller betrieben und fungiert als Proxy zwischen dem Dienst und dem Benutzer.
Anschließend wird der Service Worker über push-Events informiert, wenn es eine neue Nachricht gibt, auch wenn gerade keine Seite im Browser geöffnet ist, die er überwacht. Als Reaktion auf dieses Ereignis sollte der Worker eine sichtbare Benachrichtigung erzeugen und je nach Wunsch des Benutzers eine Seite mit weiteren Informationen in einem neuen Browsertab laden oder eine bereits geöffnete Seite in den Vordergrund holen.

### Weitere Einsatzmöglichkeiten

Besonders in seiner Funktion als Proxy kann ein Service Worker vielfältig eingesetzt werden. Neben komplexeren Cache-Strategien als einer reinen Offline-Speicherung können beispielsweise Load-Balancer implementiert werden.

## Browserunterstützung

Außer dem Internet Explorer unterstützen alle gängigen Browser Service Worker (Stand Juni 2024); Firefox (ab Version 44), Google Chrome (ab Version 40), Microsoft Edge (ab Version 17), Apple Safari (ab Version 11.1) und Opera (ab Version 27). Neben dem Umfang der Unterstützung unterscheiden sich die Browser vor allem in den Debugging-Werkzeugen für Service Worker.