Start · Sprachen · JavaScript · Referenz · MediaKeySession.load()

MediaKeySession.load()

Methode

Lädt die gespeicherten Daten einer persistenten DRM-Sitzung anhand ihrer Sitzungs-ID in das <code>MediaKeySession</code>-Objekt und liefert ein <code>Promise&lt;boolean&gt;</code>.

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

Signatur

MediaKeySession.prototype.load(sessionId)

Beschreibung

load() gehört zu den Encrypted Media Extensions (EME) und stellt eine zuvor gespeicherte, persistente Schlüsselsitzung wieder her. Das ist z. B. für Offline-Wiedergabe gedacht: Eine Lizenz wurde bei einem früheren Besuch angefordert und vom Content Decryption Module (CDM) dauerhaft gespeichert. Mit der gemerkten sessionId lässt sie sich später ohne neue Lizenzanfrage an den Server wiederverwenden.

Voraussetzung ist, dass die Sitzung mit mediaKeys.createSession("persistent-license") erzeugt wurde und das zugrunde liegende MediaKeySystemAccess mit persistentState: "required" (oder zumindest "optional" und tatsächlich unterstützt) angefordert wurde. Auf einer temporären Sitzung wirft load() einen Fehler.

Das zurückgegebene Promise wird mit true erfüllt, wenn Daten für die ID gefunden und geladen wurden, und mit false, wenn keine gespeicherte Sitzung mit dieser ID existiert. Nach erfolgreichem Laden stehen die Schlüssel über keyStatuses bereit; gegebenenfalls feuert ein keystatuseschange- oder message-Ereignis.

Jedes MediaKeySession-Objekt kann nur einmal initialisiert werden: Wurde bereits generateRequest() oder load() aufgerufen, muss für eine weitere Sitzung ein neues Objekt erzeugt werden.

Parameter

Name Typ Default Beschreibung
$sessionId Pflicht string Die eindeutige ID der zu ladenden persistenten Sitzung, typischerweise zuvor aus session.sessionId gelesen und z. B. in localStorage oder IndexedDB gespeichert.

Rückgabewert

Typ
Promise<boolean>
Beschreibung
Wird mit true erfüllt, wenn die Sitzungsdaten geladen wurden, mit false, wenn keine Daten zur ID existieren. Abgelehnt mit TypeError (leere ID), InvalidStateError (Sitzung bereits initialisiert oder geschlossen) bzw. NotSupportedError/InvalidAccessError (Sitzungstyp nicht persistent).

Beispiele

Persistente Sitzung erzeugen und ID merken

const video = document.querySelector('video');

const access = await navigator.requestMediaKeySystemAccess('com.widevine.alpha', [{
  initDataTypes: ['cenc'],
  videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }],
  persistentState: 'required',
  sessionTypes: ['persistent-license']
}]);
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);

video.addEventListener('encrypted', async (event) => {
  const session = mediaKeys.createSession('persistent-license');
  session.addEventListener('message', async (e) => {
    // Lizenz vom Server holen und an das CDM übergeben
    const res = await fetch('/license', { method: 'POST', body: e.message });
    await session.update(await res.arrayBuffer());
    // ID für spätere Offline-Nutzung speichern
    localStorage.setItem('drmSessionId', session.sessionId);
    console.log('Gespeichert:', session.sessionId);
  });
  await session.generateRequest(event.initDataType, event.initData);
});
Gespeichert: 3F2A9C...

Gespeicherte Sitzung mit load() wiederherstellen

const restoreSession = async (mediaKeys) => {
  const sessionId = localStorage.getItem('drmSessionId');
  if (!sessionId) return null;

  const session = mediaKeys.createSession('persistent-license');
  try {
    const loaded = await session.load(sessionId);
    if (!loaded) {
      console.warn('Keine gespeicherten Daten für', sessionId);
      localStorage.removeItem('drmSessionId');
      await session.close();
      return null;
    }
    console.log('Sitzung geladen, Schlüssel:', session.keyStatuses.size);
    return session;
  } catch (err) {
    console.error('load() fehlgeschlagen:', err.name, err.message);
    return null;
  }
};

const session = await restoreSession(mediaKeys);
Sitzung geladen, Schlüssel: 1

Geladene Lizenz endgültig entfernen

const deleteOfflineLicense = async (mediaKeys, sessionId) => {
  const session = mediaKeys.createSession('persistent-license');
  if (await session.load(sessionId)) {
    // remove() löscht die persistenten Daten im CDM
    await session.remove();
    await session.close();
    localStorage.removeItem('drmSessionId');
    console.log('Lizenz gelöscht');
  }
};

await deleteOfflineLicense(mediaKeys, localStorage.getItem('drmSessionId'));
Lizenz gelöscht

// Wichtig · Fallstricke

  • Nur persistente Sitzungen: load() funktioniert ausschließlich mit Sitzungen vom Typ "persistent-license". Viele CDMs (z. B. Widevine auf Desktop-Chrome ohne Offline-Unterstützung, FairPlay in Safari) unterstützen diesen Typ gar nicht – vorher per requestMediaKeySystemAccess() mit sessionTypes: ["persistent-license"] prüfen.
  • Einmalige Initialisierung: Nach generateRequest() oder einem vorherigen load() führt ein erneuter Aufruf zu InvalidStateError. Pro Ladevorgang ein neues Sitzungsobjekt erstellen.
  • false ist kein Fehler: Wenn die ID unbekannt ist (z. B. nach Löschen der Browserdaten oder im privaten Modus), wird das Promise mit false erfüllt, nicht abgelehnt – beide Fälle behandeln.
  • Sicherer Kontext: EME ist nur über HTTPS verfügbar; in iframes kann die Permissions-Policy encrypted-media den Zugriff blockieren.
  • Datenschutz: Persistente Sitzungs-IDs können zur Wiedererkennung von Nutzern dienen; Browser löschen sie daher häufig zusammen mit Cookies.