Signatur
Beschreibung
Browser teilen den Speicher von Drittanbieter-Kontexten (z. B. eingebetteten <iframe>s) inzwischen standardmäßig nach der Top-Level-Seite auf. Ein SharedWorker, der in einem eingebetteten Frame gestartet wird, landet deshalb in einer eigenen, aufgeteilten Partition. Er kann sich nicht mit Workern derselben Herkunft austauschen, die in anderen Top-Level-Kontexten oder direkt auf der eigenen Seite laufen.
Die Methode SharedWorker() eines StorageAccessHandle löst dieses Problem. Sie verhält sich wie der Konstruktor new SharedWorker(), erzeugt den Worker aber im nicht aufgeteilten Speicherbereich des Erstanbieters. Er teilt sich also Instanz und Zustand mit Workern, die die eigene Seite als Top-Level-Dokument startet.
Das Handle bekommst du nur über document.requestStorageAccess({ SharedWorker: true }). Das Promise muss erfüllt sein, und in den Optionen muss SharedWorker ausdrücklich angefordert worden sein. Die Methode ist Teil der Erweiterung „Storage Access API: Beyond Cookies“. Typische Einsatzfälle sind eingebettete Widgets wie Chat, Login oder Zahlungsdienste, die über mehrere Tabs hinweg eine gemeinsame Verbindung oder einen gemeinsamen Zustand brauchen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $scriptURL Pflicht | string | URL | URL des Worker-Skripts. Sie muss dieselbe Herkunft haben wie das aufrufende Dokument. | |
| $options | string | object | Entweder ein Name als string oder ein Objekt mit name (identifiziert die gemeinsame Instanz), type ("classic" oder "module"), credentials ("omit", "same-origin" oder "include", nur bei Modulen) und, wo unterstützt, sameSiteCookies ("all" oder "none"). |
Rückgabewert
SharedWorker-Objekt im nicht aufgeteilten Speicher des Erstanbieters. Mit ihm kommunizierst du über worker.port.Beispiele
Nicht aufgeteilten SharedWorker im iframe starten
// Läuft in einem Drittanbieter-iframe, z. B. nach einem Klick des Nutzers
const button = document.querySelector('#verbinden');
button.addEventListener('click', async () => {
try {
const handle = await document.requestStorageAccess({ SharedWorker: true });
const worker = handle.SharedWorker('/js/sync-worker.js', { name: 'sync' });
worker.port.onmessage = (event) => {
console.log('Antwort vom Worker:', event.data);
};
worker.port.start();
worker.port.postMessage({ typ: 'hallo' });
} catch (err) {
console.warn('Kein Speicherzugriff:', err.name);
}
});
Worker-Skript (sync-worker.js)
// Eine Instanz für alle Kontexte derselben Herkunft (nicht aufgeteilt)
const ports = new Set();
self.onconnect = (event) => {
const port = event.ports[0];
ports.add(port);
port.onmessage = () => {
port.postMessage({ status: 'verbunden', tabs: ports.size });
};
};
Modul-Worker mit Fallback auf den normalen Konstruktor
const createWorker = async () => {
const url = new URL('./worker.mjs', import.meta.url);
const options = { name: 'shared', type: 'module' };
if ('requestStorageAccess' in document) {
try {
const handle = await document.requestStorageAccess({ SharedWorker: true });
if (typeof handle.SharedWorker === 'function') {
return handle.SharedWorker(url, options);
}
} catch {
// Zugriff verweigert oder Option nicht unterstützt
}
}
// Fallback: aufgeteilter Worker
return new SharedWorker(url, options);
};
const worker = await createWorker();
console.log(worker instanceof SharedWorker);
// Wichtig · Fallstricke
- Kompatibilität: Experimentell. Bisher nur in Chromium-Browsern ab Version 125 verfügbar, nicht in Firefox und Safari. Prüfe vor dem Aufruf immer per Feature-Erkennung, ob die Methode existiert.
- Wurde
SharedWorker: trueinrequestStorageAccess()nicht angefordert, wirft der Aufruf eineDOMException(SecurityError). Das Gleiche passiert bei einem Skript fremder Herkunft. requestStorageAccess()braucht in der Regel eine Nutzeraktivierung (z. B. einen Klick). Außerdem kann der Browser die Anfrage ablehnen, etwa wenn die Seite zuvor nie als Erstanbieter besucht wurde.- Kein
newverwenden: Die Methode wird direkt am Handle aufgerufen, alsohandle.SharedWorker(...). - Datenschutz: Ein nicht aufgeteilter Worker ist ein Kanal über mehrere Seiten hinweg. Nimm nur Nachrichten von vertrauenswürdigen Kontexten an und prüfe sie.