JavaScript/Objekte/ServiceWorker
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
ServiceWorker-Objekte erben die Methoden der EventTarget-Schnittstelle.
Eigenschaften
- scriptURL
- state
Methoden
- postMessage()
Events
- statechange
Eigenschaften
- 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
postMessage()
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
- statechange
- Kann über eine Zuweisung an
onstatechange
oder mittelsaddEventListener
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
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
- ↑ HTML Spezifikation: Ports, abgerufen am 13.08.2021
- ↑ Wikipedia: Notification Service, abgerufen am 11.08.2021