Signatur
Beschreibung
Der Konstruktor MediaKeyMessageEvent() gehört zur Encrypted Media Extensions API (EME) und erzeugt ein Ereignisobjekt vom Typ MediaKeyMessageEvent. Normalerweise erzeugt der Browser solche Ereignisse selbst: Das Content Decryption Module (CDM) löst auf einer MediaKeySession ein message-Ereignis aus, sobald es eine Lizenzanfrage, eine Lizenzerneuerung oder eine Freigabebestätigung an den Lizenzserver schicken muss.
Selbst ruft man den Konstruktor vor allem in Unit-Tests, Mocks und beim Simulieren von DRM-Abläufen auf. So lässt sich die Lizenz-Logik eines Players (etwa das Weiterleiten von event.message an den Lizenzserver) prüfen, ohne dass ein echtes CDM oder geschützte Inhalte vorhanden sind.
Das Objekt erbt von Event und hat zusätzlich die schreibgeschützten Eigenschaften messageType und message. Beide werden über das options-Objekt gesetzt, und beide sind Pflichtangaben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, bei EME üblicherweise "message". Groß- und Kleinschreibung wird beachtet. |
|
| $options Pflicht | MediaKeyMessageEventInit | Objekt mit folgenden Feldern:
|
Rückgabewert
messageType und message aus den übergebenen Optionen stammen.Beispiele
Ereignis erzeugen und Eigenschaften lesen
const payload = new TextEncoder().encode('{"kids":["abc123"]}').buffer;
const event = new MediaKeyMessageEvent('message', {
messageType: 'license-request',
message: payload
});
console.log(event.type);
console.log(event.messageType);
console.log(event.message.byteLength);
Lizenz-Handler im Test mit einem simulierten Ereignis prüfen
// Handler, wie er in einem Player verwendet wird
const handleMessage = async (event, sendToServer) => {
if (event.messageType !== 'license-request') return null;
return sendToServer(event.message);
};
// Attrappe für den Lizenzserver
const fakeServer = async (buffer) => `Anfrage mit ${buffer.byteLength} Bytes erhalten`;
const testEvent = new MediaKeyMessageEvent('message', {
messageType: 'license-request',
message: new Uint8Array([1, 2, 3, 4]).buffer
});
const result = await handleMessage(testEvent, fakeServer);
console.log(result);
Ereignis auf einem EventTarget auslösen
const fakeSession = new EventTarget();
fakeSession.addEventListener('message', (e) => {
console.log(`Typ: ${e.messageType}, Bytes: ${e.message.byteLength}`);
});
fakeSession.dispatchEvent(new MediaKeyMessageEvent('message', {
messageType: 'license-renewal',
message: new ArrayBuffer(16)
}));
// Wichtig · Fallstricke
- Pflichtfelder: Fehlen
messageTypeodermessage, oder istmessagekeinArrayBuffer, wirft der Konstruktor einenTypeError. Typisierte Arrays (z. B.Uint8Array) übergibt man über ihre Eigenschaft.buffer. - Sicherer Kontext: EME ist nur über HTTPS bzw.
localhostverfügbar. In unsicheren Kontexten oder in Node.js existiertMediaKeyMessageEventnicht. Vorher mit'MediaKeyMessageEvent' in windowprüfen. - Ein selbst erzeugtes Ereignis hat
isTrusted === false. Das CDM reagiert nicht darauf, echte Lizenzabläufe lassen sich damit also nicht auslösen, sondern nur simulieren. - Unter
messageliegen je nach Schlüsselsystem Binärdaten (z. B. Widevine, PlayReady) oder JSON (Clear Key). Man sollte sie unverändert an den Lizenzserver weiterleiten und nicht selbst auswerten. - Der Konstruktor wird in Chrome, Edge, Firefox und Safari unterstützt, die DRM-Systeme dahinter unterscheiden sich aber je nach Browser.