Start · Sprachen · JavaScript · Referenz · PushManager.supportedContentEncodings

PushManager.supportedContentEncodings

Eigenschaft

Statische, schreibgeschützte Eigenschaft, die ein eingefrorenes Array der Inhaltskodierungen liefert, mit denen der Browser Push-Nutzlasten entschlüsseln kann (z. B. <code>"aes128gcm"</code>).

seit JavaScript Chrome 60+, Edge 17+, Firefox 44+ (Safari: ab 16 / Kategorie: webapi

Signatur

static get PushManager.supportedContentEncodings

Beschreibung

PushManager.supportedContentEncodings ist eine statische Eigenschaft. Man liest sie also direkt am Interface PushManager ab und nicht an einer Instanz wie registration.pushManager. Der Wert ist ein eingefrorenes Array mit Zeichenketten. Jede davon bezeichnet ein Verfahren, mit dem der Browser die verschlüsselte Nutzlast einer Push-Nachricht entschlüsseln kann.

Übliche Werte sind "aes128gcm" (der standardisierte Wert nach RFC 8188 und RFC 8291) und "aesgcm" (ein älterer Entwurfsstand, den einige Push-Dienste noch nutzen). Die Reihenfolge im Array zeigt die Präferenz des Browsers.

Gebraucht wird die Eigenschaft beim Anlegen eines Push-Abonnements. Der Client schickt die unterstützten Kodierungen zusammen mit dem PushSubscription-Objekt an den eigenen Anwendungsserver. Der Server wählt dann eine passende Kodierung für den Content-Encoding-Header, wenn er Nachrichten über das Web-Push-Protokoll verschickt. So vermeidet man Nachrichten, die der Browser nicht entschlüsseln kann.

Rückgabewert

Typ
ReadonlyArray<string>
Beschreibung
Ein eingefrorenes Array (Object.isFrozen() ergibt true) mit den unterstützten Kodierungen, z. B. ["aes128gcm", "aesgcm"].

Beispiele

Unterstützte Kodierungen auslesen

if ('PushManager' in window) {
  // Statischer Zugriff direkt am Interface
  const encodings = PushManager.supportedContentEncodings ?? [];
  console.log(encodings);
  console.log(Object.isFrozen(encodings));
} else {
  console.log('Push API wird nicht unterstützt');
}
["aes128gcm", "aesgcm"] true

Abonnement samt Kodierungen an den Server senden

const VAPID_PUBLIC_KEY = 'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U';

const urlBase64ToUint8Array = (base64) => {
  const padding = '='.repeat((4 - (base64.length % 4)) % 4);
  const raw = atob((base64 + padding).replace(/-/g, '+').replace(/_/g, '/'));
  return Uint8Array.from(raw, (c) => c.charCodeAt(0));
};

const subscribeAndRegister = async () => {
  const registration = await navigator.serviceWorker.register('/sw.js');
  const subscription = await registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)
  });

  // Fallback für ältere Browser ohne die Eigenschaft
  const contentEncodings = PushManager.supportedContentEncodings ?? ['aesgcm'];

  await fetch('/api/push/subscribe', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ subscription, contentEncodings })
  });
  console.log('Registriert mit:', contentEncodings[0]);
};

subscribeAndRegister().catch(console.error);
Registriert mit: aes128gcm

Bevorzugte Kodierung wählen (serverseitige Logik)

// Der Server wählt die erste Kodierung, die beide Seiten beherrschen
const SERVER_SUPPORTED = ['aes128gcm', 'aesgcm'];

const pickEncoding = (clientEncodings = ['aesgcm']) =>
  clientEncodings.find((enc) => SERVER_SUPPORTED.includes(enc)) ?? null;

console.log(pickEncoding(['aes128gcm', 'aesgcm']));
console.log(pickEncoding(['aesgcm']));
console.log(pickEncoding(['unbekannt']));
aes128gcm aesgcm null

// Wichtig · Fallstricke

  • Statisch: registration.pushManager.supportedContentEncodings ergibt undefined. Richtig ist PushManager.supportedContentEncodings.
  • Schreibgeschützt und eingefroren: push() oder das Überschreiben einzelner Einträge schlägt im strikten Modus mit einem TypeError fehl. Im nicht-strikten Modus passiert stillschweigend nichts.
  • Kompatibilität: Ältere Browser kennen die Eigenschaft nicht, auch wenn die Push API selbst vorhanden ist. Deshalb eine Feature-Erkennung und einen Fallback verwenden, etwa ?? ['aesgcm']. Safari unterstützt Web Push erst ab Version 16 (macOS 13); auf iOS/iPadOS ab 16.4 und dort nur für Web-Apps, die auf dem Home-Bildschirm installiert sind.
  • Sicherer Kontext: Die Push API gibt es nur über HTTPS (oder localhost) und nur zusammen mit einem registrierten Service Worker.
  • "aesgcm" ist ein veralteter Entwurf. Neue Server-Implementierungen sollten "aes128gcm" bevorzugen.
  • Die Eigenschaft sagt nur etwas über die Entschlüsselungsfähigkeit des Browsers aus. Ob ein Abonnement klappt, hängt zusätzlich von Nutzererlaubnis und Push-Dienst ab.