Start · Sprachen · JavaScript · Referenz · MediaKeyMessageEvent.messageType

MediaKeyMessageEvent.messageType

Eigenschaft

Die schreibgeschützte Eigenschaft <code>messageType</code> gibt an, welche Art von Nachricht das CDM über ein <code>message</code>-Event an die Anwendung sendet.

seit JavaScript Baseline: alle modernen Browser (EME) Kategorie: webapi

Signatur

MediaKeyMessageEvent.messageType

Beschreibung

Die Eigenschaft MediaKeyMessageEvent.messageType gehört zu den Encrypted Media Extensions (EME). Wenn das Content Decryption Module (CDM) über eine MediaKeySession mit dem Lizenzserver sprechen muss, löst es ein message-Event aus. Über messageType erfährt die Anwendung, wozu die Nachricht dient, und kann so entscheiden, welcher Server angesprochen wird und wie die Antwort zu verarbeiten ist.

Mögliche Werte (Aufzählung MediaKeyMessageType):

  • "license-request" – erste Lizenzanfrage für eine neue Sitzung.
  • "license-renewal" – Erneuerung einer bestehenden Lizenz (z. B. bei zeitlich begrenzten Lizenzen).
  • "license-release" – Bestätigung, dass eine persistente Lizenz freigegeben wurde (nach session.remove()).
  • "individualization-request" – Anfrage zur Individualisierung des CDM (gerätespezifische Initialisierung).

Die eigentlichen Nutzdaten stehen in event.message als ArrayBuffer. Die Antwort des Servers wird mit session.update() an das CDM zurückgegeben – bei "license-release" handelt es sich dabei um die Freigabebestätigung.

Rückgabewert

Typ
"license-request" | "license-renewal" | "license-release" | "individualization-request"
Beschreibung
Ein String aus der Aufzählung MediaKeyMessageType, der den Zweck der Nachricht beschreibt.

Beispiele

Nachrichten je nach Typ an den Lizenzserver weiterleiten

const video = document.querySelector('video');

const config = [{
  initDataTypes: ['cenc'],
  videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}];

const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', config);
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);

video.addEventListener('encrypted', async (e) => {
  const session = mediaKeys.createSession();

  session.addEventListener('message', async (event) => {
    console.log('Nachrichtentyp:', event.messageType);

    const url = event.messageType === 'individualization-request'
      ? 'https://drm.example.com/provision'
      : 'https://drm.example.com/license';

    const response = await fetch(url, {
      method: 'POST',
      body: event.message
    });
    await session.update(await response.arrayBuffer());
  });

  await session.generateRequest(e.initDataType, e.initData);
});
Nachrichtentyp: license-request

Erneuerungen und Freigaben protokollieren

const handleMessage = async (event) => {
  const session = event.target;

  switch (event.messageType) {
    case 'license-request':
      console.log('Neue Lizenz wird angefordert');
      break;
    case 'license-renewal':
      console.log('Lizenz läuft ab – Erneuerung angefordert');
      break;
    case 'license-release':
      console.log('Freigabebestätigung wird gesendet');
      break;
    default:
      console.warn('Unbekannter Typ:', event.messageType);
  }

  const res = await fetch('/api/drm', { method: 'POST', body: event.message });
  await session.update(await res.arrayBuffer());
};

// session stammt aus mediaKeys.createSession()
session.addEventListener('message', handleMessage);
Neue Lizenz wird angefordert

Event manuell konstruieren (z. B. für Tests)

const evt = new MediaKeyMessageEvent('message', {
  messageType: 'license-renewal',
  message: new Uint8Array([1, 2, 3]).buffer
});

console.log(evt.messageType);
console.log(evt.message.byteLength);
license-renewal 3

// Wichtig · Fallstricke

  • Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode TypeError).
  • Welche Typen tatsächlich auftreten, hängt vom Schlüsselsystem ab: "individualization-request" wird z. B. von Clear Key nie gesendet, "license-release" nur bei Sitzungen vom Typ "persistent-license".
  • Ältere Browserversionen (vor der finalen EME-Spezifikation) kannten messageType teilweise nicht – im Zweifel "license-request" als Standardwert annehmen.
  • EME ist nur in sicheren Kontexten (HTTPS) verfügbar. Lizenzanfragen sollten stets über HTTPS erfolgen und serverseitig authentifiziert sein.
  • Unbekannte, künftig ergänzte Werte sollten robust behandelt werden (default-Zweig), statt einen Fehler zu werfen.