Start · Sprachen · JavaScript · Referenz · new ExtendableMessageEvent()

new ExtendableMessageEvent()

Methode

Erstellt ein neues <code>ExtendableMessageEvent</code>-Objekt, also ein Nachrichten-Event im Service Worker, dessen Lebensdauer sich mit <code>waitUntil()</code> verlängern lässt.

seit JavaScript Service Worker API – Chrome 45+, Firefox 44+, Safa Kategorie: webapi

Signatur

new ExtendableMessageEvent(type, options)

Beschreibung

Der Konstruktor ExtendableMessageEvent() erzeugt ein Event-Objekt vom Typ ExtendableMessageEvent. Diese Event-Art erhält ein Service Worker im message-Event, wenn eine Seite ihm z. B. mit navigator.serviceWorker.controller.postMessage() Daten schickt. Weil die Klasse von ExtendableEvent erbt, stellt sie waitUntil() bereit. Damit bleibt der Worker aktiv, bis asynchrone Arbeit wie Cache-Updates abgeschlossen ist.

Normalerweise legt der Browser diese Events selbst an. Den Konstruktor ruft man von Hand vor allem in Unit-Tests auf, zum Simulieren von Nachrichten innerhalb eines Service Workers oder beim Nachbau (Polyfill/Mock) einer Service-Worker-Umgebung. Neben den üblichen Event-Optionen nimmt er die Nachrichtenfelder data, origin, lastEventId, source und ports entgegen.

Wichtig: Der Konstruktor steht nur im Service-Worker-Kontext (ServiceWorkerGlobalScope) zur Verfügung, im Fenster-Kontext einer normalen Seite dagegen nicht. Ein Event, das per dispatchEvent() ausgelöst wird, hat isTrusted === false.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Name des Events, üblicherweise "message". Groß- und Kleinschreibung wird beachtet.
$options object {} Optionales Konfigurationsobjekt. Neben den Feldern aus ExtendableEventInit (bubbles, cancelable, composed) sind möglich:
  • data (any, Standard null): die Nutzdaten der Nachricht.
  • origin (string, Standard ""): Herkunft (Origin) des Absenders.
  • lastEventId (string, Standard ""): ID des letzten Events.
  • source (Client | ServiceWorker | MessagePort | null, Standard null): Absender der Nachricht.
  • ports (MessagePort[], Standard []): mitgesendete Nachrichten-Ports.

Rückgabewert

Typ
ExtendableMessageEvent
Beschreibung
Ein neues ExtendableMessageEvent-Objekt mit den übergebenen Eigenschaften.

Beispiele

Event im Service Worker erzeugen und auslesen

// sw.js – läuft im ServiceWorkerGlobalScope
const event = new ExtendableMessageEvent('message', {
  data: { type: 'PING', payload: 42 },
  origin: self.location.origin,
  lastEventId: 'evt-1'
});

console.log(event.type);          // 'message'
console.log(event.data.payload);  // 42
console.log(event.ports.length);  // 0
console.log(event.source);        // null
message 42 0 null

Nachricht intern simulieren und mit waitUntil verarbeiten

// sw.js
self.addEventListener('message', (event) => {
  if (event.data?.type === 'CACHE_URLS') {
    event.waitUntil(
      caches.open('v1').then((cache) => cache.addAll(event.data.urls))
    );
    console.log('Caching gestartet, isTrusted:', event.isTrusted);
  }
});

// Simulierte Nachricht, z. B. beim Aktivieren
self.addEventListener('activate', () => {
  const simulated = new ExtendableMessageEvent('message', {
    data: { type: 'CACHE_URLS', urls: ['/', '/offline.html'] }
  });
  self.dispatchEvent(simulated);
});
Caching gestartet, isTrusted: false

MessagePort für eine Antwort mitgeben

// sw.js – Antwortkanal testen
const { port1, port2 } = new MessageChannel();

port2.onmessage = (e) => console.log('Antwort:', e.data);

self.addEventListener('message', (event) => {
  event.ports[0]?.postMessage(`Echo: ${event.data}`);
});

self.dispatchEvent(new ExtendableMessageEvent('message', {
  data: 'Hallo',
  ports: [port1]
}));
Antwort: Echo: Hallo

// Wichtig · Fallstricke

  • Nur im Service Worker: In einem normalen Fenster- oder Dedicated-Worker-Kontext ist ExtendableMessageEvent nicht definiert, der Aufruf führt dort zu einem ReferenceError. Mit 'ExtendableMessageEvent' in self lässt sich vorher prüfen, ob die Klasse vorhanden ist.
  • waitUntil() darf nur synchron während der Event-Verarbeitung aufgerufen werden, sonst wird ein InvalidStateError ausgelöst. Bei selbst ausgelösten (untrusted) Events verlängert es die Lebensdauer des Workers nicht zuverlässig.
  • Von Hand erzeugte Events haben isTrusted === false. Sicherheit: Bei echten Nachrichten sollte man event.origin bzw. event.source prüfen, bevor man die Daten verarbeitet. Geben Sie im Test kein gefälschtes origin vor, auf dessen Prüfung sich Ihr Produktionscode verlässt.
  • Das Feld ports erwartet echte MessagePort-Objekte. Andere Werte führen zu einem TypeError.
  • Browser-Unterstützung: in allen modernen Browsern mit Service-Worker-Support vorhanden. Service Worker setzen HTTPS voraus (Ausnahme: localhost).