Signatur
Beschreibung
Die schreibgeschützte Eigenschaft navigator.storage steht innerhalb von Web Workern, Shared Workern und Service Workern zur Verfügung. Sie gibt dasselbe StorageManager-Objekt zurück, das im Hauptthread über Navigator.storage erreichbar ist. Es gilt für die gesamte Origin, also nicht nur für den einzelnen Worker.
Über den StorageManager kannst du vor allem:
- mit
estimate()abfragen, wie viel Speicher die Origin gerade belegt (usage) und wie viel ihr maximal zusteht (quota), - mit
persisted()prüfen, ob der Speicher als dauerhaft markiert ist, der Browser ihn also bei Speicherknappheit nicht automatisch löscht, - mit
getDirectory()auf das Origin Private File System (OPFS) zugreifen. Nur in dedizierten Workern gibt es dort zusätzlich die schnelle synchrone SchnittstellecreateSyncAccessHandle().
Praktisch ist das für Service Worker, die vor dem Befüllen eines Caches den freien Platz prüfen, und für Worker, die große Datenmengen (etwa SQLite-WASM-Datenbanken oder Medien) im OPFS ablegen, ohne dabei den Hauptthread zu blockieren.
Rückgabewert
StorageManager-Singleton der aktuellen Origin. Bei jedem Zugriff ist es dasselbe Objekt.Beispiele
Speicherbelegung im Service Worker vor dem Caching prüfen
// sw.js
self.addEventListener('install', (event) => {
event.waitUntil((async () => {
const { usage, quota } = await navigator.storage.estimate();
const freeMB = (quota - usage) / 1024 / 1024;
console.log(`Frei: ${freeMB.toFixed(1)} MB`);
// Große Assets nur cachen, wenn genug Platz vorhanden ist
const cache = await caches.open('assets-v1');
const urls = freeMB > 50
? ['/app.js', '/styles.css', '/video/intro.mp4']
: ['/app.js', '/styles.css'];
await cache.addAll(urls);
})());
});
Datei im Origin Private File System aus einem dedizierten Worker schreiben
// worker.js (dedizierter Worker)
self.onmessage = async ({ data }) => {
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('log.txt', { create: true });
// Synchroner Zugriff ist nur in dedizierten Workern verfügbar
const access = await fileHandle.createSyncAccessHandle();
const bytes = new TextEncoder().encode(data + '\n');
access.write(bytes, { at: access.getSize() });
access.flush();
const size = access.getSize();
access.close();
self.postMessage(`log.txt ist jetzt ${size} Bytes groß`);
};
Status der dauerhaften Speicherung abfragen
// worker.js
const checkPersistence = async () => {
if (!('storage' in navigator)) {
return 'StorageManager nicht verfügbar';
}
const persistent = await navigator.storage.persisted();
return persistent
? 'Speicher ist dauerhaft'
: 'Speicher kann vom Browser geräumt werden';
};
checkPersistence().then(console.log);
// Wichtig · Fallstricke
- Secure Context:
navigator.storagegibt es nur unter HTTPS oderlocalhost. In unsicheren Kontexten ist die Eigenschaftundefined. Prüfe das am besten per Feature-Erkennung ('storage' in navigator). persist()fehlt im Worker: Die MethodeStorageManager.persist()ist nur im Fensterkontext verfügbar, weil sie unter Umständen eine Nutzerinteraktion oder Berechtigung braucht. Im Worker kannst du nurpersisted()abfragen.- Ungenaue Werte:
estimate()liefert absichtlich nur Näherungswerte (Schutz vor Fingerprinting). Verlasse dich nicht auf bytegenaue Angaben. Das Kontingent unterscheidet sich außerdem stark zwischen Browsern und Geräten. - Synchroner OPFS-Zugriff:
createSyncAccessHandle()funktioniert nur in dedizierten Workern, nicht in Shared oder Service Workern. Solange ein solches Handle offen ist, bleibt die Datei gesperrt. Schließe es deshalb immer mitclose(). - Kompatibilität:
estimate()undpersisted()funktionieren in allen aktuellen Browsern.getDirectory()gibt es in Chrome 86+, Firefox 111+ und Safari 15.2+. In älteren Safari-Versionen fehlen Teile davon.