Signatur
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
[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}`);
}
});
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.');
}
});
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));
});
// 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 sichhas()undget(), die eineBufferSourceentgegennehmen. - Der Iterator ist eine Momentaufnahme: Nach einem neuen
keystatuseschange-Ereignis solltest duentries()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.