Start · Sprachen · JavaScript · Referenz · MediaKeyStatusMap.keys()

MediaKeyStatusMap.keys()

Methode

Gibt einen neuen Iterator über alle Schlüssel-IDs (<code>keyId</code> als <code>ArrayBuffer</code>) einer <code>MediaKeyStatusMap</code> zurück.

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

Signatur

MediaKeyStatusMap.prototype.keys()

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

Typ
Iterator<ArrayBuffer>
Beschreibung
Ein neues Iterator-Objekt, das die Schlüssel-IDs aller Einträge der 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));
  }
});
Schlüssel-ID: 9eb4050de44b4802932e27d75083e266

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));
});
Erwarteter Schlüssel geladen: true

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);
Schlüssel 1 Länge in Bytes: 16 Anzahl Schlüssel: 1 === size: 1

// 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 per session.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.