Start · Sprachen · JavaScript · Referenz · WorkerNavigator.storage

WorkerNavigator.storage

Eigenschaft

Liefert im Worker-Kontext das Singleton <code>StorageManager</code>, über das man Speicherkontingent, Belegung und dauerhafte Speicherung der aktuellen Origin abfragt.

seit JavaScript Baseline: alle modernen Browser (seit ca. 2023 vol Kategorie: webapi

Signatur

get WorkerNavigator.storage

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 Schnittstelle createSyncAccessHandle().

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

Typ
StorageManager
Beschreibung
Das 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);
  })());
});
Frei: 2048.0 MB

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ß`);
};
log.txt ist jetzt 12 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);
Speicher kann vom Browser geräumt werden

// Wichtig · Fallstricke

  • Secure Context: navigator.storage gibt es nur unter HTTPS oder localhost. In unsicheren Kontexten ist die Eigenschaft undefined. Prüfe das am besten per Feature-Erkennung ('storage' in navigator).
  • persist() fehlt im Worker: Die Methode StorageManager.persist() ist nur im Fensterkontext verfügbar, weil sie unter Umständen eine Nutzerinteraktion oder Berechtigung braucht. Im Worker kannst du nur persisted() 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 mit close().
  • Kompatibilität: estimate() und persisted() funktionieren in allen aktuellen Browsern. getDirectory() gibt es in Chrome 86+, Firefox 111+ und Safari 15.2+. In älteren Safari-Versionen fehlen Teile davon.