Start · Sprachen · JavaScript · Referenz · ExtendableMessageEvent.lastEventId

ExtendableMessageEvent.lastEventId

Eigenschaft

Nur lesbare Eigenschaft, die als String die letzte Ereignis-ID der Ereignisquelle liefert. Bei Service-Worker-Nachrichten ist sie in der Praxis fast immer ein leerer String.

seit JavaScript Baseline: alle modernen Browser (Service Worker) Kategorie: webapi

Signatur

ExtendableMessageEvent.lastEventId

Beschreibung

Die schreibgeschützte Eigenschaft lastEventId des Interfaces ExtendableMessageEvent gibt einen String mit der letzten Ereignis-ID der Ereignisquelle zurück. Das Feld stammt aus dem Modell von MessageEvent. Dort gibt es bei Server-Sent Events (EventSource) die ID an, die der Server zuletzt mit einer id:-Zeile gesendet hat.

ExtendableMessageEvent ist der Ereignistyp des message-Ereignisses im globalen Bereich eines Service Workers (ServiceWorkerGlobalScope). Wenn eine Seite mit ServiceWorker.postMessage() eine Nachricht an den Worker schickt, setzt der Browser lastEventId immer auf den leeren String "". Einen Wert hat die Eigenschaft nur, wenn Sie das Ereignis selbst mit dem Konstruktor new ExtendableMessageEvent(type, { lastEventId }) erzeugen, etwa in Tests oder beim Weiterleiten von SSE-Daten.

Deshalb dient die Eigenschaft vor allem dazu, die Schnittstelle zu MessageEvent einheitlich zu halten. Wer Ereignis-IDs, zum Beispiel für das Fortsetzen eines Datenstroms, zuverlässig zwischen Seite und Service Worker austauschen will, sollte sie besser in den Nutzdaten (event.data) mitschicken.

Rückgabewert

Typ
string
Beschreibung
Die letzte Ereignis-ID als String. Bei normalen postMessage()-Nachrichten an einen Service Worker ist das ein leerer String "".

Beispiele

lastEventId im message-Handler des Service Workers auslesen

// sw.js
self.addEventListener('message', (event) => {
  console.log('Daten:', event.data);
  console.log('lastEventId:', JSON.stringify(event.lastEventId));
});

// main.js (Seite)
const registration = await navigator.serviceWorker.ready;
registration.active.postMessage({ typ: 'ping' });
Daten: { typ: 'ping' } lastEventId: ""

Ereignis mit eigener ID erzeugen (z. B. für Tests)

// Im Service-Worker-Kontext, wo ExtendableMessageEvent verfügbar ist
const evt = new ExtendableMessageEvent('message', {
  data: { preis: 42 },
  lastEventId: 'evt-1007',
  origin: self.location.origin
});

console.log(evt.lastEventId);

// Nur lesbar: die Zuweisung wird ignoriert (im Strict Mode TypeError)
try {
  evt.lastEventId = 'anders';
} catch (e) {
  console.log(e.name);
}
console.log(evt.lastEventId);
evt-1007 TypeError evt-1007

Zuverlässige Alternative: Ereignis-ID in den Nutzdaten mitschicken

// main.js: SSE-Ereignisse an den Service Worker weiterreichen
const source = new EventSource('/api/stream');
source.addEventListener('message', async (e) => {
  const { active } = await navigator.serviceWorker.ready;
  // e.lastEventId ist hier (MessageEvent aus SSE) gesetzt
  active.postMessage({ id: e.lastEventId, payload: e.data });
});

// sw.js
self.addEventListener('message', (event) => {
  const id = event.data?.id ?? event.lastEventId;
  event.waitUntil(
    caches.open('stream-state').then((cache) =>
      cache.put('/last-id', new Response(id))
    )
  );
});

// Wichtig · Fallstricke

  • Fast immer leer: Bei Nachrichten über postMessage() ist lastEventId immer "". Die SSE-ID aus einer EventSource wird nicht automatisch an den Service Worker weitergegeben.
  • Nur lesbar: Eine Zuweisung hat keine Wirkung und löst im Strict Mode einen TypeError aus. Einen eigenen Wert setzen Sie nur über das Init-Objekt des Konstruktors.
  • Schreibweise: Die Eigenschaft heißt lastEventId und nicht lastEventID, wie es in manchen Dokumentationen steht. Mit der falschen Schreibweise erhalten Sie undefined.
  • Kompatibilität: Verfügbar ist die Eigenschaft nur im Service-Worker-Kontext, und zwar in allen modernen Browsern (Chrome, Edge, Firefox, Safari 11.1+). Service Worker brauchen einen sicheren Kontext (HTTPS oder localhost).