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

MediaKeyStatusMap.has()

Methode

Gibt einen <code>boolean</code> zurück, der angibt, ob die <code>MediaKeyStatusMap</code> einer Sitzung einen Status für die angegebene Schlüssel-ID enthält.

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

Signatur

MediaKeyStatusMap.prototype.has(keyId)

Beschreibung

Die Methode has() des Interfaces MediaKeyStatusMap prüft, ob für eine bestimmte Schlüssel-ID (Key ID) ein Status in der Map vorhanden ist. Die Map selbst erreicht man über MediaKeySession.keyStatuses. Sie gehört zu den Encrypted Media Extensions (EME), mit denen DRM-geschützte Medien im Browser wiedergegeben werden.

Typischerweise nutzt man has() im Handler des keystatuseschange-Events einer MediaKeySession, um herauszufinden, ob das Lizenz-/CDM-System einen bestimmten Schlüssel überhaupt kennt, bevor man mit get() dessen Status (z. B. "usable", "expired", "output-restricted") ausliest.

Wichtig: Schlüssel-IDs sind Binärdaten (BufferSource), keine Strings. Der Vergleich erfolgt über den Byte-Inhalt, nicht über die Objektidentität – ein neu erzeugtes Uint8Array mit denselben Bytes wird also korrekt gefunden.

Parameter

Name Typ Default Beschreibung
$keyId Pflicht BufferSource (ArrayBuffer | TypedArray | DataView) Die Schlüssel-ID, nach der gesucht wird – meist 16 Byte, z. B. aus der initData oder dem Lizenz-Server bekannt.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn für die Schlüssel-ID ein Status in der Map existiert, sonst false.

Beispiele

Schlüssel im keystatuseschange-Handler prüfen

// Schlüssel-ID aus Hex-String erzeugen
const hexToBytes = (hex) =>
  new Uint8Array(hex.match(/../g).map((b) => parseInt(b, 16)));

const videoKeyId = hexToBytes('0123456789abcdef0123456789abcdef');

session.addEventListener('keystatuseschange', () => {
  const statuses = session.keyStatuses;
  if (statuses.has(videoKeyId)) {
    console.log('Status Video-Schlüssel:', statuses.get(videoKeyId));
  } else {
    console.warn('Video-Schlüssel noch nicht bekannt');
  }
});
Status Video-Schlüssel: usable

Komplette EME-Sitzung mit Clear Key

const video = document.querySelector('video');
const keyId = new Uint8Array(16).fill(1);

const setupEme = async () => {
  const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
    initDataTypes: ['keyids'],
    videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
  }]);
  const mediaKeys = await access.createMediaKeys();
  await video.setMediaKeys(mediaKeys);

  const session = mediaKeys.createSession();
  session.addEventListener('keystatuseschange', () => {
    console.log('Schlüssel vorhanden:', session.keyStatuses.has(keyId));
  });
  return session;
};

setupEme().catch(console.error);
Schlüssel vorhanden: true

Vor dem Laden prüfen, ob alle Schlüssel nutzbar sind

const allKeysUsable = (session, keyIds) =>
  keyIds.every((id) =>
    session.keyStatuses.has(id) && session.keyStatuses.get(id) === 'usable'
  );

if (allKeysUsable(session, [audioKeyId, videoKeyId])) {
  video.play();
}

// Wichtig · Fallstricke

  • Keine Strings: has('0123…') funktioniert nicht und wirft einen TypeError. Die Schlüssel-ID muss als BufferSource übergeben werden.
  • Zeitpunkt: Direkt nach createSession() ist die Map leer. Einträge erscheinen erst, nachdem die Lizenz mit session.update() verarbeitet wurde – daher im keystatuseschange-Event prüfen.
  • has() sagt nur, ob der Schlüssel bekannt ist, nicht ob er nutzbar ist. Den Status liefert get().
  • EME braucht einen sicheren Kontext (HTTPS). Welche Schlüsselsysteme (Widevine, PlayReady, FairPlay, Clear Key) verfügbar sind, hängt vom Browser und von der Plattform ab.