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

MediaKeyStatusMap.entries()

Methode

Gibt einen Iterator über alle <code>[keyId, status]</code>-Paare einer <code>MediaKeyStatusMap</code> zurück, also über Schlüssel-IDs und deren aktuellen Status.

seit JavaScript Baseline: alle modernen Browser (Encrypted Media E Kategorie: webapi

Signatur

MediaKeyStatusMap.prototype.entries()

Beschreibung

entries() gehört zur MediaKeyStatusMap, die du über MediaKeySession.keyStatuses erhältst. Diese Map ist schreibgeschützt und beschreibt für jede Schlüssel-ID (Key ID), die das Content Decryption Module (CDM) einer Sitzung kennt, den aktuellen Zustand, z. B. "usable", "expired" oder "output-restricted".

Die Methode liefert einen neuen Iterator. Jeder Schritt gibt ein zweielementiges Array zurück: An Position 0 steht die Schlüssel-ID als ArrayBuffer, an Position 1 der Status als String. Weil die Map iterierbar ist, macht for (const [id, status] of session.keyStatuses) dasselbe wie entries(). Mit dem expliziten Aufruf wird die Absicht im Code deutlicher, außerdem kannst du das Ergebnis direkt an Array.from() übergeben.

Typischerweise liest du die Map im Handler des Ereignisses keystatuseschange einer MediaKeySession aus. So kannst du auf abgelaufene Lizenzen reagieren, die Wiedergabequalität anpassen, wenn die Ausgabe eingeschränkt ist ("output-restricted", z. B. bei fehlendem HDCP), oder Fehler protokollieren.

Mögliche Statuswerte sind "usable", "expired", "released", "output-restricted", "output-downscaled", "usable-in-future", "status-pending" und "internal-error".

Rückgabewert

Typ
Iterator<[ArrayBuffer, string]>
Beschreibung
Ein neuer Iterator, der für jeden Eintrag ein Array [keyId, status] liefert. keyId ist ein ArrayBuffer, status ein MediaKeyStatus-String.

Beispiele

Schlüsselstatus bei keystatuseschange protokollieren

// Hilfsfunktion: Key-ID als Hex-String darstellen
const toHex = (buffer) =>
  [...new Uint8Array(buffer)]
    .map((b) => b.toString(16).padStart(2, '0'))
    .join('');

// session: eine MediaKeySession, erzeugt über mediaKeys.createSession()
session.addEventListener('keystatuseschange', () => {
  for (const [keyId, status] of session.keyStatuses.entries()) {
    console.log(`Key ${toHex(keyId)}: ${status}`);
  }
});
Key 9eb4050de44b4802932e27d75083e266: usable

Auf abgelaufene oder eingeschränkte Schlüssel reagieren

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

session.addEventListener('keystatuseschange', async () => {
  const entries = Array.from(session.keyStatuses.entries());

  const expired = entries.filter(([, status]) => status === 'expired');
  const restricted = entries.some(([, status]) => status === 'output-restricted');

  if (expired.length > 0) {
    console.warn(`${expired.length} Schlüssel abgelaufen – Sitzung wird geschlossen.`);
    video.pause();
    await session.close();
  } else if (restricted) {
    // z. B. auf eine Variante mit niedrigerer Auflösung wechseln (ohne HDCP-Pflicht)
    console.info('Ausgabe eingeschränkt – wechsle auf SD-Qualität.');
  }
});
Ausgabe eingeschränkt – wechsle auf SD-Qualität.

Status als einfaches Objekt für Telemetrie aufbereiten

const toHex = (buf) =>
  [...new Uint8Array(buf)].map((b) => b.toString(16).padStart(2, '0')).join('');

const snapshotKeyStatuses = (session) =>
  Object.fromEntries(
    Array.from(session.keyStatuses.entries(), ([id, status]) => [toHex(id), status])
  );

session.addEventListener('keystatuseschange', () => {
  const snapshot = snapshotKeyStatuses(session);
  console.log(JSON.stringify(snapshot));
  // navigator.sendBeacon('/drm-telemetry', JSON.stringify(snapshot));
});
{"9eb4050de44b4802932e27d75083e266":"usable"}

// Wichtig · Fallstricke

  • Die Schlüssel sind Binärdaten: Die Key-IDs sind ArrayBuffer-Objekte und werden nicht per Wert verglichen. Wandle sie für Vergleiche, Logs oder als Objektschlüssel in einen Hex- oder Base64-String um. Zum gezielten Nachschlagen eignen sich has() und get(), die eine BufferSource entgegennehmen.
  • Der Iterator ist eine Momentaufnahme: Nach einem neuen keystatuseschange-Ereignis solltest du entries() erneut aufrufen, statt einen alten Iterator oder ein zwischengespeichertes Array weiterzuverwenden.
  • Reihenfolge: Die Reihenfolge der Einträge legt die EME-Spezifikation bzw. das CDM fest. Verlass dich nicht auf eine bestimmte Reihenfolge, etwa die der Lizenzanfrage.
  • Leere Map: Vor dem ersten erfolgreichen session.update() ist die Map meist leer, der Iterator liefert dann keine Einträge.
  • Kompatibilität: Encrypted Media Extensions funktionieren nur in sicheren Kontexten (HTTPS). Welche Statuswerte vorkommen, hängt vom Key System ab (Widevine, PlayReady, FairPlay). "usable-in-future" wird zum Beispiel nicht überall unterstützt. In älteren Safari-Versionen mit präfixierter EME-API (WebKitMediaKeys) gibt es diese Map nicht.