Signatur
Beschreibung
Die Methode keys() der Schnittstelle MediaKeyStatusMap liefert einen Iterator, der nacheinander die Schlüssel-IDs aller Einträge der Statusliste ausgibt. Die Statusliste gehört zu einer MediaKeySession (Eigenschaft session.keyStatuses) und gehört zu den Encrypted Media Extensions (EME), mit denen DRM-geschützte Medien im Browser abgespielt werden.
Jeder Schlüssel ist eine Schlüssel-ID vom Typ ArrayBuffer (bzw. einer BufferSource), keine Zeichenkette. Wer die IDs anzeigen, protokollieren oder mit Werten aus dem Manifest (z. B. default_KID bei DASH) vergleichen will, muss sie deshalb selbst umwandeln, etwa in eine Hex-Zeichenkette.
Man nutzt keys() typischerweise im Handler des Events keystatuseschange, wenn man nur wissen will, welche Schlüssel die Sitzung gerade kennt. Braucht man zusätzlich den Status ("usable", "expired", "output-restricted" …), sind entries() oder forEach() praktischer. Die Reihenfolge der Einträge entspricht der Reihenfolge, in der das Content Decryption Module (CDM) sie meldet.
Rückgabewert
MediaKeyStatusMap nacheinander liefert.Beispiele
Alle Schlüssel-IDs einer Sitzung als Hex ausgeben
// Hilfsfunktion: ArrayBuffer in Hex-String umwandeln
const toHex = (buffer) =>
[...new Uint8Array(buffer)]
.map((b) => b.toString(16).padStart(2, '0'))
.join('');
session.addEventListener('keystatuseschange', () => {
for (const keyId of session.keyStatuses.keys()) {
console.log('Schlüssel-ID:', toHex(keyId));
}
});
Prüfen, ob eine erwartete Schlüssel-ID vorhanden ist
const toHex = (buffer) =>
[...new Uint8Array(buffer)]
.map((b) => b.toString(16).padStart(2, '0'))
.join('');
// KID aus dem DASH-Manifest (ohne Bindestriche)
const expectedKid = '9eb4050de44b4802932e27d75083e266';
const hasExpectedKey = (session) =>
[...session.keyStatuses.keys()].some((id) => toHex(id) === expectedKid);
session.addEventListener('keystatuseschange', () => {
console.log('Erwarteter Schlüssel geladen:', hasExpectedKey(session));
});
Iterator manuell mit next() durchlaufen
const iterator = session.keyStatuses.keys();
let result = iterator.next();
let count = 0;
while (!result.done) {
count++;
console.log('Schlüssel', count, 'Länge in Bytes:', result.value.byteLength);
result = iterator.next();
}
console.log('Anzahl Schlüssel:', count, '=== size:', session.keyStatuses.size);
// Wichtig · Fallstricke
- Schlüssel sind Binärdaten: Die IDs sind
ArrayBuffer-Objekte. Ein Vergleich mit===vergleicht nur Referenzen – für inhaltliche Vergleiche in Hex/Base64 umwandeln oder byteweise vergleichen. - Leere Map direkt nach Erzeugung: Vor dem ersten
keystatuseschange-Event (also bevor eine Lizenz persession.update()verarbeitet wurde) liefert der Iterator in der Regel keine Einträge. - Momentaufnahme: Die Map kann sich bei jedem Statuswechsel ändern. Den Iterator nicht zwischenspeichern, sondern bei jedem Event neu abfragen;
[...map.keys()]erzeugt eine stabile Kopie. - Kompatibilität: Teil der Encrypted Media Extensions; in Chrome, Edge, Firefox und Safari verfügbar, erfordert aber einen sicheren Kontext (HTTPS) und ein verfügbares CDM (z. B. Widevine, FairPlay, PlayReady). In manchen eingebetteten oder privaten Umgebungen kann EME deaktiviert sein.