Signatur
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
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'));
}
});
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);
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
}
}
});
// Wichtig · Fallstricke
- NaN-Prüfung: Der Wert ist oft
NaN, vor allem vor dem erstenupdate()oder bei unbefristeten Lizenzen. Prüfe ihn mitNumber.isNaN(), denn Vergleiche wie=== NaNergeben immerfalse.new Date(NaN)liefert ein „Invalid Date“. - Kein Änderungsereignis: Für Änderungen an
expirationgibt es kein eigenes Ereignis. Werte den Zustand der Schlüssel überkeystatuseschangeundkeyStatusesaus. - 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.