Start · Sprachen · JavaScript · Referenz · Client.id

Client.id

Eigenschaft

Schreibgeschützte Eigenschaft, die die universell eindeutige Kennung (UUID-String) eines <code>Client</code>-Objekts im Service Worker liefert.

seit JavaScript Baseline: alle modernen Browser (nur in Service-Wo Kategorie: webapi

Signatur

Client.id

Beschreibung

Die Eigenschaft Client.id gibt einen String mit der eindeutigen Kennung eines Clients zurück, also eines Fensters, Tabs, Workers oder Shared Workers, der von einem Service Worker kontrolliert wird oder in seinem Gültigkeitsbereich liegt. Die Kennung bleibt über die gesamte Lebensdauer des Clients gleich und wird vom Browser vergeben.

Gebraucht wird id vor allem dann, wenn ein Service Worker einen bestimmten Client gezielt ansprechen will: Mit clients.get(id) holt man das passende Client-Objekt zurück, zum Beispiel über FetchEvent.clientId oder FetchEvent.resultingClientId in einem fetch-Handler. So kann man Antworten, Statusmeldungen oder Synchronisationsdaten gezielt an den Tab schicken, der eine Anfrage ausgelöst hat.

Weil die Kennung stabil ist, eignet sie sich auch als Schlüssel in einer Map, um Daten für einzelne Clients im Service Worker abzulegen, etwa den Fortschritt eines Uploads oder den Zustand einer Sitzung.

Rückgabewert

Typ
string
Beschreibung
Eine vom Browser vergebene, eindeutige Kennung des Clients (üblicherweise im UUID-Format, z. B. "7a1c3e2f-…"). Schreibgeschützt.

Beispiele

Alle kontrollierten Fenster mit ihrer ID auflisten

// sw.js
self.addEventListener('message', async (event) => {
  if (event.data === 'list-clients') {
    const allClients = await self.clients.matchAll({ type: 'window' });
    for (const client of allClients) {
      console.log(client.id, client.url);
    }
  }
});
3f0c9b8e-2a4d-4e51-9c1f-0b6d7e8a1234 https://example.com/ 9d2e1a7c-5b3f-4c80-8e2a-6f4b1c0d5678 https://example.com/profil

Dem anfragenden Tab gezielt antworten (FetchEvent.clientId)

// sw.js
self.addEventListener('fetch', (event) => {
  if (!event.request.url.endsWith('/api/daten')) return;

  event.respondWith((async () => {
    const response = await fetch(event.request);
    // clientId ist leer, wenn es sich um eine Navigation handelt
    if (event.clientId) {
      const client = await self.clients.get(event.clientId);
      client?.postMessage({ typ: 'geladen', clientId: client.id });
    }
    return response;
  })());
});

Zustand pro Client in einer Map speichern

// sw.js
const zustand = new Map();

self.addEventListener('message', (event) => {
  const quelle = event.source; // Client-Objekt
  const bisher = zustand.get(quelle.id) ?? 0;
  zustand.set(quelle.id, bisher + 1);
  quelle.postMessage(`Nachricht Nr. ${bisher + 1} von ${quelle.id}`);
});
Nachricht Nr. 1 von 3f0c9b8e-2a4d-4e51-9c1f-0b6d7e8a1234

// Wichtig · Fallstricke

  • Nur im Service Worker verfügbar: Client-Objekte gibt es ausschließlich im Service-Worker-Kontext (über clients.matchAll(), clients.get() oder event.source). Eine Seite kann ihre eigene Client-ID nicht direkt abfragen und muss sie sich bei Bedarf vom Service Worker schicken lassen.
  • Nicht dauerhaft gültig: Die ID gehört zu einem einzelnen Dokument oder Worker. Nach einem Neuladen oder einer Navigation entsteht ein neuer Client mit einer neuen ID. Deshalb sollte man IDs nicht dauerhaft speichern, etwa in IndexedDB. Einträge für geschlossene Clients in einer Map sollte man regelmäßig entfernen, sonst wächst der Speicher immer weiter.
  • Leere ID bei Navigationen: Bei Navigationsanfragen ist FetchEvent.clientId ein leerer String. Den künftigen Client liefert dann FetchEvent.resultingClientId.
  • clients.get(id) gibt undefined zurück, wenn der Client nicht mehr existiert. Dieser Fall sollte immer abgefangen werden.
  • Die Kennung verrät keine Nutzerdaten. Man sollte sich aber nicht auf ein bestimmtes Format verlassen, sondern sie nur als undurchsichtigen String verwenden.