Start · Sprachen · JavaScript · Referenz · MediaKeySession.closed

MediaKeySession.closed

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>Promise</code> liefert. Es wird erfüllt, sobald die <code>MediaKeySession</code> geschlossen ist, und enthält den Grund dafür.

seit JavaScript Baseline: alle modernen Browser (Grund-String im P Kategorie: webapi

Signatur

MediaKeySession.closed

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

Typ
Promise<MediaKeySessionClosedReason | undefined>
Beschreibung
Ein 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();
Sitzung 1234abcd geschlossen: closed-by-application

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);
  });
};
CDM hat Sitzung beendet: hardware-context-reset

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);
};
Aufgeräumt, Grund: closed-by-application

// 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 Beispiel reason ?? 'unbekannt'.
  • Das Promise wird nie abgelehnt. Ein catch() fängt hier nichts ab. Fehler aus generateRequest(), update() oder close() muss man separat behandeln.
  • Bei einer Sitzung, für die generateRequest() oder load() 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.