Signatur
Beschreibung
Die Methode getSubscriptions() des Interfaces CookieStoreManager gibt alle Cookie-Änderungsabonnements zurück, die zuvor mit subscribe() für eine ServiceWorkerRegistration angelegt wurden. Den CookieStoreManager erreichst du über registration.cookies, sowohl im Fenster-Kontext als auch im Service Worker selbst.
Jedes Abonnement wird als einfaches Objekt mit den Eigenschaften name (Cookie-Name, optional) und url (absoluter URL-Geltungsbereich) geliefert. Gibt es noch keine Abonnements, erhältst du ein leeres Array.
Typische Anwendungsfälle:
- Vor dem Anlegen prüfen, ob ein Abonnement schon existiert, damit du nicht doppelt abonnierst.
- Debuggen und Protokollieren, auf welche Cookies der Service Worker mit
cookiechange-Events reagiert. - Alle bestehenden Abonnements aufräumen, z. B. beim Abmelden, indem du das Ergebnis direkt an
unsubscribe()weitergibst.
Rückgabewert
name (Name des Cookies, fehlt bei Abonnements ohne Namensfilter) und url (absolute URL, die den Geltungsbereich angibt). Ohne Abonnements ist das Array leer.Beispiele
Abonnements im Service Worker auflisten
// sw.js
self.addEventListener('activate', (event) => {
event.waitUntil((async () => {
const subs = await self.registration.cookies.getSubscriptions();
console.log(`Anzahl Abonnements: ${subs.length}`);
for (const { name, url } of subs) {
console.log(`Cookie "${name ?? '(alle)'}" für ${url}`);
}
})());
});
Nur abonnieren, wenn noch nicht vorhanden
// sw.js
const ensureSubscription = async (name) => {
const manager = self.registration.cookies;
const url = self.registration.scope;
const subs = await manager.getSubscriptions();
const exists = subs.some((s) => s.name === name && s.url === url);
if (!exists) {
await manager.subscribe([{ name, url }]);
console.log(`Abonnement für "${name}" angelegt`);
} else {
console.log(`"${name}" ist bereits abonniert`);
}
};
self.addEventListener('activate', (event) => {
event.waitUntil(ensureSubscription('session'));
});
self.addEventListener('cookiechange', (event) => {
for (const c of event.changed) console.log('Geändert:', c.name, c.value);
for (const c of event.deleted) console.log('Gelöscht:', c.name);
});
Alle Abonnements aus der Seite heraus entfernen
// main.js (Fenster-Kontext)
const clearCookieSubscriptions = async () => {
const registration = await navigator.serviceWorker.ready;
if (!registration.cookies) {
console.warn('CookieStoreManager wird nicht unterstützt');
return;
}
const subs = await registration.cookies.getSubscriptions();
if (subs.length > 0) {
await registration.cookies.unsubscribe(subs);
}
const rest = await registration.cookies.getSubscriptions();
console.log(`Verbleibende Abonnements: ${rest.length}`);
};
clearCookieSubscriptions();
// Wichtig · Fallstricke
- Browser-Unterstützung: Die Cookie Store API wird noch nicht überall unterstützt: Chromium seit Version 87, Firefox und Safari erst seit Kurzem. Prüfe vorher mit
'cookies' in registrationbzw.if (registration.cookies). - Nur in sicheren Kontexten (HTTPS oder
localhost) verfügbar und nur mit einer aktivenServiceWorkerRegistration. - Abonnements sind an die Registrierung gebunden: Wird der Service Worker abgemeldet (
unregister()), verschwinden auch alle Abonnements. - Die zurückgegebene
urlist immer absolut aufgelöst, auch wenn beimsubscribe()eine relative URL angegeben wurde. Vergleiche daher mit absoluten URLs, z. B.registration.scope. - Die Reihenfolge der Einträge ist nicht garantiert. Verlass dich nicht auf den Index.
HttpOnly-Cookies lösen zwarcookiechange-Events aus, ihre Werte sind aber für die Cookie Store API nicht sichtbar.