Start · Sprachen · JavaScript · Referenz · ExtendableCookieChangeEvent.changed

ExtendableCookieChangeEvent.changed

Eigenschaft

Schreibgeschütztes Array aller Cookies, die im Rahmen eines <code>cookiechange</code>-Events im Service Worker gesetzt oder geändert wurden.

seit JavaScript Chrome/Edge 87+ (Cookie Store API im Service Worke Kategorie: webapi

Signatur

ExtendableCookieChangeEvent.changed

Beschreibung

Die schreibgeschützte Eigenschaft changed des Interfaces ExtendableCookieChangeEvent enthält alle Cookies, die durch die auslösende Änderung neu gesetzt oder überschrieben wurden. Jedes Element ist ein Objekt mit den Feldern name, value sowie, je nach Browser, domain, path, expires, secure, sameSite und partitioned.

Das Event ExtendableCookieChangeEvent gibt es nur im Service Worker. Es wird als cookiechange auf ServiceWorkerGlobalScope ausgelöst, allerdings nur für Cookies, die der Worker vorher über registration.cookies.subscribe() abonniert hat. Im Fenster-Kontext heißt das entsprechende Event CookieChangeEvent und hat ebenfalls eine changed-Eigenschaft.

Typische Einsatzfälle: Session-Cookies überwachen (z. B. Login/Logout erkennen), Caches beim Wechsel einer Sprach- oder Theme-Einstellung leeren oder offene Clients über geänderte Einstellungen informieren. Gelöschte Cookies und solche, deren Ablaufdatum in der Vergangenheit liegt, stehen nicht in changed, sondern in deleted.

Rückgabewert

Typ
ReadonlyArray<CookieListItem>
Beschreibung
Ein eingefrorenes Array von Cookie-Objekten ({ name, value, domain, path, expires, secure, sameSite, partitioned }). Ist leer, wenn das Event nur Löschungen meldet.

Beispiele

Cookie-Änderungen im Service Worker abonnieren und auswerten

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

self.addEventListener('cookiechange', (event) => {
  for (const cookie of event.changed) {
    console.log(`Geändert: ${cookie.name} = ${cookie.value}`);
  }
  for (const cookie of event.deleted) {
    console.log(`Gelöscht: ${cookie.name}`);
  }
});
Geändert: theme = dark

Clients bei neuem Session-Cookie benachrichtigen

// sw.js
self.addEventListener('cookiechange', (event) => {
  const session = event.changed.find((c) => c.name === 'session');
  if (!session) return;

  event.waitUntil((async () => {
    const clients = await self.clients.matchAll({ type: 'window' });
    for (const client of clients) {
      client.postMessage({ type: 'login', expires: session.expires });
    }
  })());
});

Cache beim Theme-Wechsel verwerfen

// sw.js
self.addEventListener('cookiechange', (event) => {
  const themeChanged = event.changed.some((c) => c.name === 'theme');
  if (themeChanged) {
    event.waitUntil(caches.delete('html-pages-v1'));
    console.log('HTML-Cache wegen Theme-Wechsel geleert');
  }
});
HTML-Cache wegen Theme-Wechsel geleert

// Wichtig · Fallstricke

  • Nur mit Abonnement: Ohne vorheriges registration.cookies.subscribe() wird im Service Worker kein cookiechange ausgelöst und changed wird nie befüllt.
  • Nur sicherer Kontext: Die Cookie Store API setzt HTTPS (oder localhost) voraus.
  • HttpOnly-Cookies sind für Skripte unsichtbar und tauchen in changed nicht auf.
  • Ein Cookie, das mit abgelaufenem expires gesetzt wird, gilt als gelöscht und erscheint in deleted, nicht in changed.
  • Das Array ist eingefroren. push() oder Zuweisungen haben keine Wirkung bzw. werfen im strikten Modus einen Fehler.
  • Kompatibilität: Wird nur von Chromium-Browsern unterstützt (Chrome, Edge, Opera). Firefox und Safari kennen ExtendableCookieChangeEvent nicht. Vor der Nutzung sollte man prüfen, ob die API vorhanden ist, z. B. mit 'cookies' in self.registration.
  • Asynchrone Arbeit im Handler immer mit event.waitUntil() absichern, sonst kann der Worker vorzeitig beendet werden.