Signatur
Beschreibung
Die Eigenschaft size des Interfaces MediaKeyStatusMap gibt an, wie viele Schlüssel aktuell in der Statuskarte einer MediaKeySession geführt werden. Jeder Eintrag verknüpft eine Schlüssel-ID (ArrayBuffer bzw. BufferSource) mit einem Status wie "usable", "expired", "released", "output-restricted", "output-downscaled", "status-pending" oder "internal-error".
Man erreicht die Map über session.keyStatuses. Nützlich ist size vor allem im Handler des Events keystatuseschange: Damit lässt sich schnell prüfen, ob das Content Decryption Module (CDM) nach einer Lizenzantwort überhaupt Schlüssel geladen hat (size > 0), bevor man die einzelnen Einträge mit forEach(), entries() oder for...of auswertet.
Der Wert ist eine Momentaufnahme. Die Map wird vom Browser aktualisiert, sobald sich der Schlüsselzustand ändert — etwa nach session.update(), beim Ablauf einer Lizenz oder nach session.close()/session.remove().
Beispiele
Anzahl der Schlüssel nach keystatuseschange prüfen
// session ist eine MediaKeySession, erzeugt über mediaKeys.createSession()
session.addEventListener('keystatuseschange', () => {
const statuses = session.keyStatuses;
if (statuses.size === 0) {
console.warn('Noch keine Schlüssel geladen.');
return;
}
console.log(`Die Sitzung enthält ${statuses.size} Schlüssel.`);
});
Nutzbare Schlüssel zählen und mit size vergleichen
const reportKeyHealth = (session) => {
const map = session.keyStatuses;
let usable = 0;
for (const [, status] of map) {
if (status === 'usable') usable++;
}
console.log(`${usable} von ${map.size} Schlüsseln nutzbar`);
return usable === map.size && map.size > 0;
};
session.onkeystatuseschange = () => {
if (!reportKeyHealth(session)) {
console.warn('Nicht alle Schlüssel sind abspielbereit.');
}
};
Komplette EME-Einrichtung mit size-Ausgabe
const video = document.querySelector('video');
const setupEme = async () => {
const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
initDataTypes: ['cenc'],
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}]);
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);
video.addEventListener('encrypted', async (event) => {
const session = mediaKeys.createSession();
console.log('Vor der Lizenz:', session.keyStatuses.size);
session.addEventListener('keystatuseschange', () => {
console.log('Nach der Lizenz:', session.keyStatuses.size);
});
await session.generateRequest(event.initDataType, event.initData);
});
};
setupEme().catch(console.error);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
sizewird ignoriert (im Strict ModeTypeError). Die Map lässt sich nur indirekt über das CDM ändern. - Keine echte
Map:MediaKeyStatusMapbesitzt keinset(),delete()oderclear();sizeverhält sich aber wieMap.prototype.size. - Zeitpunkt: Direkt nach
createSession()odergenerateRequest()istsizemeist0. Werte erst im Eventkeystatuseschangeauslesen. - Kompatibilität: Wird in allen aktuellen Browsern mit EME-Unterstützung angeboten; erfordert einen sicheren Kontext (HTTPS). Welche Schlüsselsysteme (Widevine, PlayReady, FairPlay, Clear Key) verfügbar sind, hängt von Browser und Plattform ab.