Start · Sprachen · JavaScript · Referenz · MediaKeySession.expiration

MediaKeySession.expiration

Eigenschaft

Schreibgeschützte Eigenschaft, die den Ablaufzeitpunkt der Schlüssel einer <code>MediaKeySession</code> in Millisekunden seit der Unix-Epoche liefert – oder <code>NaN</code>, wenn keiner existiert.

seit JavaScript Encrypted Media Extensions (EME); Baseline: aktuel Kategorie: webapi

Signatur

MediaKeySession.expiration

Beschreibung

Die schreibgeschützte Eigenschaft expiration des Interfaces MediaKeySession gibt an, ab wann die Schlüssel der aktuellen Sitzung nicht mehr zum Entschlüsseln von Mediendaten verwendet werden dürfen. Der Wert ist eine Zahl in Millisekunden seit dem 1. Januar 1970 UTC (wie bei Date.now()) und lässt sich direkt an new Date() übergeben.

Gibt es keinen Ablaufzeitpunkt oder hat das Content Decryption Module (CDM) noch keinen festgelegt, ist der Wert NaN. Das ist direkt nach dem Erzeugen der Sitzung mit MediaKeys.createSession() normal: Erst wenn eine Lizenz über update() geladen wurde, kann das CDM eine Ablaufzeit setzen, etwa bei Leih- oder Abo-Lizenzen mit fester Gültigkeit.

Ändert das CDM den Wert, gibt es kein eigenes Ereignis dafür. In der Praxis prüft man expiration nach dem Lizenz-Update und bei keystatuseschange. Hier wechselt der Status abgelaufener Schlüssel auf "expired". So kann die Anwendung zum Beispiel anzeigen, wie lange ein Leihfilm noch verfügbar ist, oder rechtzeitig eine neue Lizenz anfordern.

Rückgabewert

Typ
number
Beschreibung
Zeitpunkt in Millisekunden seit der Unix-Epoche (UTC), ab dem die Schlüssel ungültig sind, oder NaN, wenn kein Ablaufzeitpunkt existiert bzw. noch nicht bekannt ist.

Beispiele

Ablaufzeit nach dem Lizenz-Update auslesen

// Voraussetzung: mediaKeys wurde über navigator.requestMediaKeySystemAccess() erzeugt
const session = mediaKeys.createSession('temporary');

session.addEventListener('message', async (event) => {
  // Lizenzanfrage an den Lizenzserver senden
  const response = await fetch('https://license.example.com/widevine', {
    method: 'POST',
    body: event.message
  });
  const license = await response.arrayBuffer();
  await session.update(license);

  if (Number.isNaN(session.expiration)) {
    console.log('Lizenz ohne Ablaufdatum');
  } else {
    console.log('Lizenz gültig bis:', new Date(session.expiration).toLocaleString('de-DE'));
  }
});
Lizenz gültig bis: 14.6.2025, 20:30:00

Restlaufzeit einer Leihlizenz anzeigen

const formatRemaining = (session) => {
  const exp = session.expiration;
  if (Number.isNaN(exp)) return 'unbegrenzt';

  const ms = exp - Date.now();
  if (ms <= 0) return 'abgelaufen';

  const hours = Math.floor(ms / 3_600_000);
  const minutes = Math.floor((ms % 3_600_000) / 60_000);
  return `${hours} Std. ${minutes} Min.`;
};

setInterval(() => {
  document.querySelector('#restzeit').textContent = formatRemaining(session);
}, 60_000);
47 Std. 12 Min.

Ablauf zusammen mit keystatuseschange überwachen

session.addEventListener('keystatuseschange', () => {
  for (const [keyId, status] of session.keyStatuses) {
    if (status === 'expired') {
      console.warn('Schlüssel abgelaufen, Ablaufzeit war:',
        new Date(session.expiration).toISOString());
      // z. B. Wiedergabe stoppen oder neue Lizenz anfordern
    }
  }
});
Schlüssel abgelaufen, Ablaufzeit war: 2025-06-14T18:30:00.000Z

// Wichtig · Fallstricke

  • NaN-Prüfung: Der Wert ist oft NaN, vor allem vor dem ersten update() oder bei unbefristeten Lizenzen. Prüfe ihn mit Number.isNaN(), denn Vergleiche wie === NaN ergeben immer false. new Date(NaN) liefert ein „Invalid Date“.
  • Kein Änderungsereignis: Für Änderungen an expiration gibt es kein eigenes Ereignis. Werte den Zustand der Schlüssel über keystatuseschange und keyStatuses aus.
  • Abhängig vom CDM: Ob und wann eine Ablaufzeit gesetzt wird, hängt vom Schlüsselsystem (Widevine, PlayReady, FairPlay, Clear Key) und von der Lizenz ab. Clear Key setzt in der Regel keine Ablaufzeit.
  • Keine Sicherheitsgarantie auf dem Client: Durchgesetzt wird der Ablauf vom CDM. Die Anzeige in der Anwendung dient nur zur Information, und die Uhr des Clients kann falsch gehen.
  • Kompatibilität: EME ist nur in sicheren Kontexten (HTTPS) verfügbar. Die Eigenschaft wird von allen aktuellen Desktop-Browsern unterstützt. Auf Mobilgeräten und in WebViews kann die Unterstützung eingeschränkt sein.