Start · Sprachen · JavaScript · Referenz · ServiceWorkerRegistration.cookies

ServiceWorkerRegistration.cookies

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>CookieStoreManager</code> einer Service-Worker-Registrierung liefert. Darüber lassen sich Abonnements für Cookie-Änderungen verwalten.

seit JavaScript Chromium 87+ (Chrome, Edge, Opera); in Firefox und Kategorie: webapi

Signatur

ServiceWorkerRegistration.cookies

Beschreibung

Die Eigenschaft cookies einer ServiceWorkerRegistration gibt ein CookieStoreManager-Objekt zurück. Es gehört zur Cookie Store API. Damit legt ein Service Worker fest, bei welchen Cookie-Änderungen er benachrichtigt werden soll. Hat er ein Abonnement, empfängt er das Ereignis cookiechange auf ServiceWorkerGlobalScope. Das funktioniert auch dann, wenn gerade keine Seite der Website geöffnet ist.

Der CookieStoreManager hat drei Methoden, die alle ein Promise zurückgeben:

  • subscribe(subscriptions) fügt Abonnements hinzu. Übergeben wird ein Array aus Objekten der Form { name, url }.
  • getSubscriptions() liefert alle aktuellen Abonnements.
  • unsubscribe(subscriptions) entfernt die angegebenen Abonnements.

Man verwendet die Eigenschaft, wenn ein Service Worker auf Cookie-Änderungen reagieren soll. Typische Fälle: einen Cache leeren, sobald das Sitzungs-Cookie gelöscht wird (Abmeldung), oder Offline-Daten neu synchronisieren, wenn sich ein Einstellungs-Cookie ändert. Im Service Worker greift man über self.registration.cookies darauf zu. In einer Seite erreicht man ihn über (await navigator.serviceWorker.ready).cookies.

Rückgabewert

Typ
CookieStoreManager
Beschreibung
Das CookieStoreManager-Objekt dieser Registrierung. Es liefert bei jedem Zugriff dasselbe Objekt und bietet die Methoden subscribe(), getSubscriptions() und unsubscribe().

Beispiele

Sitzungs-Cookie im Service Worker abonnieren

// sw.js
self.addEventListener('activate', (event) => {
  event.waitUntil(
    self.registration.cookies.subscribe([
      { name: 'session_id', url: '/' }
    ])
  );
});

self.addEventListener('cookiechange', (event) => {
  for (const cookie of event.deleted) {
    if (cookie.name === 'session_id') {
      // Abmeldung erkannt: private Daten aus dem Cache entfernen
      caches.delete('user-data');
      console.log('Sitzung beendet, Cache geleert');
    }
  }
  for (const cookie of event.changed) {
    console.log('Geändert:', cookie.name, cookie.value);
  }
});
Sitzung beendet, Cache geleert

Abonnements von der Seite aus abfragen

// main.js (Seitenkontext)
const registration = await navigator.serviceWorker.ready;

if ('cookies' in registration) {
  const subs = await registration.cookies.getSubscriptions();
  subs.forEach(({ name, url }) => console.log(`${name} -> ${url}`));
} else {
  console.log('CookieStoreManager wird nicht unterstützt');
}
session_id -> https://example.com/

Alle Abonnements wieder entfernen

// sw.js
const resetCookieSubscriptions = async () => {
  const manager = self.registration.cookies;
  const subs = await manager.getSubscriptions();
  if (subs.length > 0) {
    await manager.unsubscribe(subs);
  }
  console.log('Verbleibend:', (await manager.getSubscriptions()).length);
};

self.addEventListener('message', (event) => {
  if (event.data === 'reset-cookies') {
    event.waitUntil(resetCookieSubscriptions());
  }
});
Verbleibend: 0

// Wichtig · Fallstricke

  • Browser-Unterstützung: Vollständig nur in Chromium-Browsern (ab Version 87). Firefox und Safari unterstützen Teile der Cookie Store API wie cookieStore, aber ServiceWorkerRegistration.cookies und das cookiechange-Ereignis im Service Worker fehlen dort teilweise oder ganz. Deshalb vor der Nutzung mit 'cookies' in registration prüfen.
  • Die Eigenschaft steht nur in sicheren Kontexten (HTTPS oder localhost) zur Verfügung.
  • Die url eines Abonnements muss im Scope der Registrierung liegen, sonst wird das Promise mit einem TypeError abgelehnt. Ohne Angabe gilt der Scope der Registrierung als URL.
  • Abonnements bleiben an die Registrierung gebunden. Wird der Service Worker abgemeldet (unregister()), verschwinden auch die Abonnements.
  • HttpOnly-Cookies sind für die Cookie Store API unsichtbar. Für sie gibt es keine Benachrichtigungen.
  • subscribe() am besten im install- oder activate-Ereignis aufrufen und in event.waitUntil() einbetten. Sonst kann der Worker beendet werden, bevor das Abonnement gespeichert ist.