Signatur
Beschreibung
Die Eigenschaft sessionId einer MediaKeySession enthält eine eindeutige Kennung, die das Content Decryption Module (CDM) für die Sitzung vergibt. Sie gehört zur Encrypted Media Extensions (EME)-API, mit der DRM-geschützte Medien (z. B. über Widevine, PlayReady oder FairPlay) im Browser abgespielt werden.
Direkt nach MediaKeys.createSession() ist sessionId ein leerer String. Einen Wert bekommt die Eigenschaft erst, wenn die Sitzung initialisiert wurde, also nach generateRequest() (sobald das zurückgegebene Promise erfüllt ist) oder nach einem erfolgreichen load().
Besonders wichtig ist die Kennung bei persistenten Sitzungen ("persistent-license"). Die Anwendung speichert die sessionId, z. B. in localStorage oder IndexedDB, und lädt die Sitzung später mit session.load(sessionId) wieder, ohne erneut eine Lizenz anzufordern. Außerdem eignet sich die ID für Logging, Fehlersuche und die Zuordnung mehrerer Sitzungen in einer Anwendung.
Rückgabewert
generateRequest() oder load() ist es ein leerer String "".Beispiele
sessionId vor und nach generateRequest()
const video = document.querySelector('video');
video.addEventListener('encrypted', async (event) => {
const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
initDataTypes: [event.initDataType],
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}]);
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);
const session = mediaKeys.createSession();
console.log('Vorher:', JSON.stringify(session.sessionId));
await session.generateRequest(event.initDataType, event.initData);
console.log('Nachher:', session.sessionId);
}, { once: true });
Persistente Lizenz speichern und später wiederherstellen
const STORAGE_KEY = 'drm-session-id';
const createPersistentSession = async (mediaKeys, initDataType, initData) => {
const session = mediaKeys.createSession('persistent-license');
await session.generateRequest(initDataType, initData);
// ID für den nächsten Seitenaufruf merken
localStorage.setItem(STORAGE_KEY, session.sessionId);
return session;
};
const restoreSession = async (mediaKeys) => {
const storedId = localStorage.getItem(STORAGE_KEY);
if (!storedId) return null;
const session = mediaKeys.createSession('persistent-license');
const loaded = await session.load(storedId);
if (!loaded) {
localStorage.removeItem(STORAGE_KEY);
return null;
}
console.log('Sitzung wiederhergestellt:', session.sessionId === storedId);
return session;
};
Sitzungen anhand der ID verwalten und protokollieren
const sessions = new Map();
const trackSession = (session) => {
sessions.set(session.sessionId, session);
session.addEventListener('keystatuseschange', () => {
for (const [keyId, status] of session.keyStatuses) {
console.log(`[${session.sessionId}] Schlüsselstatus: ${status}`);
}
});
session.closed.then(() => {
console.log(`Sitzung ${session.sessionId} geschlossen`);
sessions.delete(session.sessionId);
});
};
// Wichtig · Fallstricke
- Leerer String am Anfang: Vor
generateRequest()oderload()istsessionId"". Wer die ID zu früh ausliest, etwa als Schlüssel in einerMap, kann Sitzungen falsch zuordnen. - Schreibgeschützt: Eine Zuweisung wird im nicht-strikten Modus stillschweigend ignoriert und erzeugt im strikten Modus einen
TypeError. - Format hängt vom CDM ab: Aufbau und Länge der ID sind nicht festgelegt. Behandeln Sie sie als undurchsichtigen Wert und werten Sie sie nicht aus.
- Persistenz:
load()funktioniert nur mit Sitzungstyp"persistent-license"und nur, wenn das Schlüsselsystem das unterstützt (persistentState: "required"). Viele Schlüsselsysteme unterstützen es nicht, auf manchen Plattformen gar keines. Eintemporary-Sitzungs-ID lässt sich nicht wiederherstellen. - Datenschutz: Die ID kann als Kennung zum Wiedererkennen von Nutzern dienen. Browser trennen sie deshalb je Herkunft (Origin) und löschen gespeicherte Sitzungen beim Entfernen der Website-Daten.
- Kompatibilität: EME wird in allen modernen Browsern unterstützt, aber nur in einem sicheren Kontext (HTTPS). Welche Schlüsselsysteme verfügbar sind, hängt von Browser und Betriebssystem ab.