Signatur
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
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');
}
});
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);
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 einenTypeError. Die Schlüssel-ID muss alsBufferSourceübergeben werden. - Zeitpunkt: Direkt nach
createSession()ist die Map leer. Einträge erscheinen erst, nachdem die Lizenz mitsession.update()verarbeitet wurde – daher imkeystatuseschange-Event prüfen. has()sagt nur, ob der Schlüssel bekannt ist, nicht ob er nutzbar ist. Den Status liefertget().- 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.