Signatur
Beschreibung
Die Eigenschaft closed gehört zur Encrypted Media Extensions API (EME). Sie liefert ein Promise, das erfüllt wird, sobald die zugehörige MediaKeySession geschlossen ist. Das passiert in zwei Fällen: Die Anwendung ruft selbst session.close() auf, oder das Content Decryption Module (CDM) schließt die Sitzung eigenständig, zum Beispiel nach einem internen Fehler, wenn die Hardware zurückgesetzt wird oder weil Ressourcen freigegeben werden müssen.
In aktuellen Browsern wird das Promise mit einem Wert vom Typ MediaKeySessionClosedReason erfüllt. Mögliche Werte sind "internal-error", "closed-by-application", "release-acknowledged", "hardware-context-reset" und "resource-evicted". Mit dem Grund kann eine Anwendung unterscheiden, ob sie selbst aufgeräumt hat oder ob sie auf ein unerwartetes Ende reagieren muss, etwa indem sie eine neue Sitzung anlegt und die Lizenz neu anfordert.
Einen Listener für ein Close-Ereignis gibt es nicht. Wer das Ende einer Sitzung zuverlässig erkennen will, zum Beispiel um den Player zu stoppen, eine Meldung anzuzeigen oder die Wiedergabe mit einer neuen Lizenz fortzusetzen, verwendet dieses Promise. Man fragt die Eigenschaft einmal ab, am besten direkt nach createSession(), und hängt mit then() oder await die eigene Logik an.
Rückgabewert
Promise, das beim Schließen der Sitzung erfüllt wird. Der Wert ist ein Grund-String wie "closed-by-application" oder "internal-error". In älteren Implementierungen ist er undefined. Das Promise wird nie abgelehnt, und es ist bei jedem Zugriff dasselbe Objekt.Beispiele
Auf das Schließen einer Sitzung reagieren
const video = document.querySelector('video');
const setupDrm = 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);
const session = mediaKeys.createSession();
// Überwachung direkt nach dem Anlegen einrichten
session.closed.then((reason) => {
console.log(`Sitzung ${session.sessionId || '(ohne ID)'} geschlossen:`, reason);
});
return session;
};
setupDrm();
Nach unerwartetem Schließen eine neue Sitzung anlegen
const watchSession = (mediaKeys, session, initDataType, initData) => {
session.closed.then(async (reason) => {
if (reason === 'closed-by-application' || reason === 'release-acknowledged') {
return; // regulär beendet, nichts zu tun
}
console.warn('CDM hat Sitzung beendet:', reason ?? 'unbekannt');
const newSession = mediaKeys.createSession();
watchSession(mediaKeys, newSession, initDataType, initData);
await newSession.generateRequest(initDataType, initData);
});
};
Sitzung schließen und auf Abschluss warten
const shutdownSession = async (session) => {
// close() löst closed aus; auf closed zu warten stellt sicher, dass wirklich aufgeräumt wurde
await session.close();
const reason = await session.closed;
console.log('Aufgeräumt, Grund:', reason);
};
// Wichtig · Fallstricke
- Der Grund-String ist nicht überall vorhanden: Ältere Browserversionen erfüllen das Promise mit
undefined. Den Grund deshalb immer mit einem Rückfallwert auswerten, zum Beispielreason ?? 'unbekannt'. - Das Promise wird nie abgelehnt. Ein
catch()fängt hier nichts ab. Fehler ausgenerateRequest(),update()oderclose()muss man separat behandeln. - Bei einer Sitzung, für die
generateRequest()oderload()nie aufgerufen wurde, bleibt das Promise unter Umständen dauerhaft offen. - Nach dem Schließen kann die Sitzung nicht wiederverwendet werden. Für eine neue Lizenz ist immer eine neue Sitzung per
createSession()nötig. - EME funktioniert nur in einer sicheren Umgebung (HTTPS). Welche Key-Systeme verfügbar sind, hängt vom Browser ab, zum Beispiel Widevine, PlayReady, FairPlay oder Clear Key.