Signatur
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
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' });
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);
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()istlastEventIdimmer"". Die SSE-ID aus einerEventSourcewird nicht automatisch an den Service Worker weitergegeben. - Nur lesbar: Eine Zuweisung hat keine Wirkung und löst im Strict Mode einen
TypeErroraus. Einen eigenen Wert setzen Sie nur über das Init-Objekt des Konstruktors. - Schreibweise: Die Eigenschaft heißt
lastEventIdund nichtlastEventID, wie es in manchen Dokumentationen steht. Mit der falschen Schreibweise erhalten Sieundefined. - 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).