Signatur
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 (nachsession.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
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);
});
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);
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);
// 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
messageTypeteilweise 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.