Start · Sprachen · JavaScript · Referenz · PushSubscription.expirationTime

PushSubscription.expirationTime

Eigenschaft

Schreibgeschützte Eigenschaft, die den Ablaufzeitpunkt eines Push-Abonnements als <code>DOMHighResTimeStamp</code> liefert oder <code>null</code>, wenn keiner festgelegt ist.

seit JavaScript Chrome 42+, Firefox 44+, Edge 17+, Safari 16 (macO Kategorie: webapi

Signatur

PushSubscription.expirationTime

Beschreibung

Die Eigenschaft expirationTime einer PushSubscription gibt an, wann das Push-Abonnement abläuft. Der Wert ist ein DOMHighResTimeStamp, also die Anzahl Millisekunden seit der Unix-Epoche (01.01.1970 UTC). Er lässt sich direkt an new Date() übergeben. Legt der Push-Dienst keinen Ablaufzeitpunkt fest, ist der Wert null.

Nützlich ist die Eigenschaft vor allem, um ein Abonnement rechtzeitig zu erneuern: Läuft es bald ab, kann die Anwendung vorher mit pushManager.subscribe() ein neues Abonnement anlegen und den neuen Endpunkt an den eigenen Server schicken. So gehen keine Push-Nachrichten verloren.

In der Praxis liefern die meisten Browser (Chrome, Firefox, Safari) derzeit null, weil deren Push-Dienste keinen festen Ablauf mitteilen. Der Code muss mit null also als Normalfall rechnen. Laufen Abonnements unerwartet ab oder werden sie widerrufen, meldet der Browser das im Service Worker über das Ereignis pushsubscriptionchange, soweit er es unterstützt.

Rückgabewert

Typ
DOMHighResTimeStamp | null
Beschreibung
Ablaufzeitpunkt in Millisekunden seit der Unix-Epoche oder null, wenn das Abonnement keinen bekannten Ablaufzeitpunkt hat.

Beispiele

Ablaufzeitpunkt des aktuellen Abonnements auslesen

const zeigeAblauf = async () => {
  const registration = await navigator.serviceWorker.ready;
  const subscription = await registration.pushManager.getSubscription();

  if (!subscription) {
    console.log('Kein Push-Abonnement vorhanden.');
    return;
  }

  const { expirationTime } = subscription;
  if (expirationTime === null) {
    console.log('Kein Ablaufzeitpunkt festgelegt.');
  } else {
    console.log('Läuft ab am:', new Date(expirationTime).toLocaleString('de-DE'));
  }
};

zeigeAblauf();
Kein Ablaufzeitpunkt festgelegt.

Abonnement kurz vor Ablauf erneuern

const VAPID_PUBLIC_KEY = 'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U';
const EINE_WOCHE = 7 * 24 * 60 * 60 * 1000;

const erneuereBeiBedarf = async () => {
  const registration = await navigator.serviceWorker.ready;
  const alt = await registration.pushManager.getSubscription();

  const laeuftBaldAb =
    alt?.expirationTime != null && alt.expirationTime - Date.now() < EINE_WOCHE;

  if (alt && !laeuftBaldAb) return alt;

  await alt?.unsubscribe();
  const neu = await registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: VAPID_PUBLIC_KEY
  });

  // Neuen Endpunkt beim eigenen Server hinterlegen
  await fetch('/api/push/subscribe', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(neu)
  });
  return neu;
};

erneuereBeiBedarf().then((s) => console.log('Aktiver Endpunkt:', s.endpoint));
Aktiver Endpunkt: https://fcm.googleapis.com/fcm/send/...

expirationTime in der JSON-Serialisierung

const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();

// toJSON() enthält expirationTime ebenfalls
const daten = subscription.toJSON();
console.log(Object.keys(daten));
console.log(daten.expirationTime);
["endpoint", "expirationTime", "keys"] null

// Wichtig · Fallstricke

  • Meist null: Die gängigen Push-Dienste setzen derzeit keinen Ablaufzeitpunkt. Verlasse dich deshalb nicht allein auf diese Eigenschaft, sondern werte zusätzlich Fehlerantworten des Push-Dienstes auf dem Server aus (HTTP 404/410 bedeutet: Abonnement ungültig, Eintrag löschen).
  • Vergleich mit null: null wird in Rechnungen zu 0. Ein Ausdruck wie expirationTime < Date.now() ist dann true, obwohl das Abonnement gar nicht abläuft. Prüfe immer vorher auf null.
  • Schreibgeschützt: Eine Zuweisung hat keine Wirkung. Den Ablaufzeitpunkt bestimmt allein der Push-Dienst.
  • Sichere Umgebung: Die Push-API gibt es nur in sicheren Kontexten (HTTPS oder localhost) und nur mit registriertem Service Worker.
  • Kompatibilität: Chromium-Browser und Firefox unterstützen die Eigenschaft. In Safari gibt es sie ab Version 16 (macOS), unter iOS/iPadOS ab 16.4 und dort nur in Web-Apps, die auf dem Home-Bildschirm installiert sind.