Start · Sprachen · JavaScript · Referenz · MediaKeyStatusMap.size

MediaKeyStatusMap.size

Eigenschaft

Schreibgeschützte Eigenschaft, die die Anzahl der Schlüssel-ID/Status-Paare in einer <code>MediaKeyStatusMap</code> als Zahl liefert.

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

Signatur

MediaKeyStatusMap.size

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.`);
});
Die Sitzung enthält 2 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.');
  }
};
1 von 2 Schlüsseln nutzbar 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);
Vor der Lizenz: 0 Nach der Lizenz: 1

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an size wird ignoriert (im Strict Mode TypeError). Die Map lässt sich nur indirekt über das CDM ändern.
  • Keine echte Map: MediaKeyStatusMap besitzt kein set(), delete() oder clear(); size verhält sich aber wie Map.prototype.size.
  • Zeitpunkt: Direkt nach createSession() oder generateRequest() ist size meist 0. Werte erst im Event keystatuseschange auslesen.
  • 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.