Start · Sprachen · JavaScript · Referenz · MediaKeyMessageEvent.message

MediaKeyMessageEvent.message

Eigenschaft

Die schreibgeschützte Eigenschaft <code>message</code> liefert einen <code>ArrayBuffer</code> mit einer Nachricht des Content Decryption Module (CDM), meist eine Lizenzanfrage.

seit JavaScript Baseline: alle modernen Browser (EME, seit ca. 201 Kategorie: webapi

Signatur

MediaKeyMessageEvent.message

Beschreibung

Die Eigenschaft MediaKeyMessageEvent.message gehört zu den Encrypted Media Extensions (EME). Sie enthält die Binärdaten, die das Content Decryption Module (CDM) an die Anwendung übergibt. In aller Regel ist das eine Lizenzanfrage (license-request), die du unverändert an deinen Lizenzserver (z. B. Widevine, PlayReady oder einen ClearKey-Server) weiterleitest.

Das Ereignis message wird auf einer MediaKeySession ausgelöst, nachdem du generateRequest() aufgerufen hast oder wenn das CDM eine Lizenzerneuerung bzw. -freigabe braucht. Welche Art von Nachricht vorliegt, erkennst du an event.messageType ("license-request", "license-renewal", "license-release", "individualization-request").

Der Inhalt des ArrayBuffer ist je nach Schlüsselsystem unterschiedlich: Bei Widevine und PlayReady ist es ein proprietäres Binärformat bzw. XML (PlayReady als UTF-16), bei ClearKey ein UTF-8-kodiertes JSON-Objekt. Die Serverantwort übergibst du anschließend mit session.update(response) wieder an die Session.

Rückgabewert

Typ
ArrayBuffer
Beschreibung
Binärdaten der CDM-Nachricht. Der Inhalt hängt vom Schlüsselsystem und von messageType ab und sollte normalerweise unverändert an den Lizenzserver geschickt werden.

Beispiele

Lizenzanfrage an den Lizenzserver weiterleiten

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

video.addEventListener('encrypted', async (event) => {
  const access = await navigator.requestMediaKeySystemAccess('com.widevine.alpha', [{
    initDataTypes: ['cenc'],
    videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
  }]);
  const mediaKeys = await access.createMediaKeys();
  await video.setMediaKeys(mediaKeys);

  const session = mediaKeys.createSession();
  session.addEventListener('message', async (msgEvent) => {
    // msgEvent.message ist ein ArrayBuffer
    const response = await fetch('https://license.example.com/widevine', {
      method: 'POST',
      body: msgEvent.message
    });
    const license = await response.arrayBuffer();
    await session.update(license);
  });

  await session.generateRequest(event.initDataType, event.initData);
});

ClearKey-Nachricht als JSON auslesen

session.onmessage = (event) => {
  const text = new TextDecoder().decode(event.message);
  const request = JSON.parse(text);
  console.log(event.messageType, request);
};
license-request { kids: ['LwVHf8JLtPrv2GUXFW2v_A'], type: 'temporary' }

Nach Nachrichtentyp unterscheiden

session.addEventListener('message', async ({ message, messageType }) => {
  console.log(`${messageType}: ${message.byteLength} Bytes`);
  if (messageType === 'license-release') {
    await fetch('/license/release', { method: 'POST', body: message });
    return;
  }
  const res = await fetch('/license', { method: 'POST', body: message });
  await session.update(await res.arrayBuffer());
});
license-request: 2 Bytes ... (Größe abhängig vom CDM)

// Wichtig · Fallstricke

  • Nicht verändern: Die Nachricht ist für den Lizenzserver bestimmt. Schicke sie als Binärdaten (ArrayBuffer) im Body; eine Umwandlung in einen String zerstört proprietäre Formate wie Widevine.
  • Serverspezifische Hülle: Manche Lizenzserver (z. B. PlayReady-Setups oder DRM-Dienstleister) erwarten die Nachricht eingebettet in JSON/Base64 oder brauchen zusätzliche Header (Token, Content-Type). Dokumentation des Anbieters beachten.
  • Sicherer Kontext: EME steht nur über HTTPS zur Verfügung; der Lizenzserver muss CORS korrekt konfigurieren, sonst scheitert der fetch().
  • Kompatibilität: Von allen modernen Browsern unterstützt, aber die verfügbaren Schlüsselsysteme unterscheiden sich (Chrome/Firefox: Widevine, Edge: PlayReady + Widevine, Safari: FairPlay). ClearKey eignet sich zum Testen.
  • Die Eigenschaft ist schreibgeschützt; synthetische Events lassen sich über new MediaKeyMessageEvent('message', { messageType, message }) erzeugen.