JavaScript/Objekte/ServiceWorker

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Das ServiceWorker-Objekt ist ein Teil des Serviceworker-API. Der Browser erzeugt ServiceWorker-Objekte zur Verwaltung der Serviceworker-Instanzen für eine Scope-URL.

Referenzinformationen[Bearbeiten]

ServiceWorker-Objekte erben die Methoden der EventTarget-Schnittstelle.

Eigenschaften

  • scriptURL
  • state

Methoden

  • postMessage()

Events

  • statechange

Eigenschaften[Bearbeiten]

scriptURL
Die URL, von der das Serviceworker-Script geladen wurde. Sofern bei der Registrierung keine abweichende Scope-URL angegegeben wurde, ist der Pfad zum Serviceworker-Script auch der Scope dieses Serviceworkers.
state
Der aktuelle Zustand dieser Serviceworker-Instanz.
parsed
Das Serviceworker-Script wird initial ausgeführt.
installing
Der ServiceWorker verarbeitet das install Event des [[JavaScript/Objekte/ServiceWorkerGlobalScope|ServiceWorkerGlobalScope]-Objekts
installed
Das installed-Event wurde verarbeitet, der Serviceworker wartet auf seine Aktivierung
activating
Der ServiceWorker verarbeitet das activate Event des [[JavaScript/Objekte/ServiceWorkerGlobalScope|ServiceWorkerGlobalScope]-Objekts
activated
Der ServiceWorker ist aktiv und kann von Clients genutzt werden
redundant
Der ServiceWorker kann nicht benutzt werden. Entweder ist die Installation gescheitert, oder ein anderer ServiceWorker wurde aktiviert.

Methoden[Bearbeiten]

postMessage()[Bearbeiten]

Diese Methode ist ähnlich zu postMessage auf dem Window-Objekt und sendet eine Message an den Serviceworker, auf dem sie aufgerufen wird. Es gibt sie in zwei Variationen:

  • postMessage(message, transfer)
  • postMessage(message, options)

wobei die erste Variante nichts weiter tut, als ein Objekt mit der Eigenschaft transfer zu erzeugen und dann die zweite Variante aufzurufen, und das options Objekt bislang lediglich nur die transfer-Option kennt. Diese Methode dient Serviceworker-Clients dazu, Daten an ihren Serviceworker zu senden. Um an die Instanz des aktiven Serviceworkers heranzukommen, verwenden Sie die controller Eigenschaft des ServiceWorkerContainer-Objekts, das in navigator.serviceWorker erhältlich ist.

Parameter
message
Ein Wert, der an den Serviceworker kopiert wird. Das heißt: im Realm des Absenders findet eine Serialisierung statt und im Realm des Serviceworkers wird daraus ein neues Objekt erstellt.
transfer
siehe options.transfer
options
Ein StructuredSerializeOptions-Objekt entsprechend der HTML5 Spec[1]
Rückgabewert
keiner (undefined).

transfer ist ein Array aus Objekten, die an den Realm des Serviceworkers zu übertragen sind. D.h. sie werden nicht serialisiert und kopiert, sondern aus dem Zugriff des Absenders entfernt und gehören dann dem Serviceworker.

Die gesendete Nachricht kann vom Serviceworker über das message Event auf seinem globalen Objekt empfangen werden.

Ereignisse[Bearbeiten]

statechange
Kann über eine Zuweisung an onstatechange oder mittels addEventListener behandelt werden.
Das Ereignis wird ausgelöst, sobald sich die state-Eigenschaft des Serviceworkers ändert. Dieses Event ist aus zwei Gründen interessant:
  • die Lifecycle-Events install und activate werden nicht auf dem Serviceworker ausgelöst, sondern im ServiceWorkerGlobalScope. Das ServiceWorker-Objekt hat so eine eigene Beobachtungsmöglichkeit, was in seinem Lifecycle passiert
  • Der Zustand redundant wird auf Grund von Lifecycle-Events anderer Serviceworker-Instanzen angenommen, deswegen ist statechange die einzige Möglichkeit für ein Serviceworker-Objekt, seine Außerdienststellung zu erkennen.


Lebenszyklus von Serviceworkern[Bearbeiten]

Für jede Scope-URL gibt es bis zu drei Serviceworker-Instanzen, die über das ServiceWorkerRegistration Objekt verwaltet werden:

  • active - dieser ServiceWorker interagiert mit Webseiten innerhalb seines Scopes.
  • waiting - eine geladene und initialisierte neue Version des Serviceworkers. Sie wartet, bis entweder der aktive Serviceworker keine Client-Seiten mehr hat, oder sie die Aktivierung durch Aufruf der skipWaiting-Methode erzwingt.
  • installing - eine neue Version des Serviceworkers, die sich gerade initialisiert. Eine neue Version wird immer dann gesucht, wenn eine Webseite abgerufen wird, die im Scope des Serviceworkers liegt. Findet der Browser beim byteweisen Vergleich des Quellcodes Unterschiede, wird der neue Worker initialisiert und bei Erfolg zum waiting Serviceworker.

Das globale Objekt eines ServiceWorkers ist kein Window-Objekt, sondern eines mit der Schnittstelle ServiceWorkerGlobalScope, eine Erweiterung von WorkerGlobalScope.

Dass ein ServiceWorker active ist, bedeutet nicht zwingend, dass das Script im Speicher ist. Wenn der letzte Client eines ServiceWorkers geschlossen wird, wird auch das ServiceWorker-Script beendet. Das bedeutet für Sie, dass Sie nicht davon ausgehen können, dass globale Variablen im Serviceworker ihre Werte behalten. Was für länger als eine Eventbehandlung gespeichert werden soll, müssen Sie anderswo speichern. Dafür können Sie ausschließlich APIs verwenden, die asynchron funktionieren, vor allem CacheStorage des ServiceWorker-API und das JavaScript/IndexedDB-API. Das LocalStorage API ist dagegen synchron und kann von Serviceworkern nicht genutzt werden.

Der aktive Serviceworker hat nun die folgenden Möglichkeiten:

  • Er wird benachrichtigt, wenn ein Client eine Ressource laden will, und kann diese Anforderung entweder aus einem Cache erfüllen oder an den Server weiterleiten.
  • Er kann mittels postMessage Nachrichten von seinen Clients erhalten und daraufhin Aktionen ausführen
  • Er kann an einen oder mehrere Clients Nachrichten mittels postMessage versenden
  • Er kann die dafür vorgesehenen Mechanismen des Betriebssytems nutzen, um dem Benutzer Nachrichten aufzudrängen. Entweder stumm, oder mit Signalton und/oder Vibration.
  • Er kann vom Server Push-Nachrichten erhalten, auch ohne dass Client-Webseiten geladen sind. Dieser Mechanismus ist allerdings komplex, setzt passende Pushdienste im Web voraus und hat gravierende Sicherheitsimplikationen. Pushdienste gibt es von Amazon, Apple, Google, Microsoft, Mozilla und weiteren Anbietern[2].

Referenzen[Bearbeiten]

  1. HTML Spezifikation: Ports, abgerufen am 13.08.2021
  2. Wikipedia: Notification Service, abgerufen am 11.08.2021