Signatur
Beschreibung
PressureRecord ist Teil der Compute Pressure API. Ein solches Objekt beschreibt, in welchem Druckzustand sich eine Quelle (derzeit nur "cpu") zu einem bestimmten Zeitpunkt befindet. Du erzeugst es nie selbst: Ein PressureObserver liefert immer dann ein Array von PressureRecord-Objekten an seinen Callback, wenn sich der Zustand ändert. Mit takeRecords() kannst du noch nicht zugestellte Einträge auch direkt abholen.
Ein Eintrag hat drei schreibgeschützte Eigenschaften:
source: die beobachtete Quelle als String, derzeit"cpu".state: der Druckzustand, einer der Werte"nominal","fair","serious"oder"critical".time: einDOMHighResTimeStamp(in Millisekunden, bezogen aufperformance.timeOrigin), der den Zeitpunkt des Eintrags angibt.
Außerdem gibt die Methode toJSON() die Eigenschaften als einfaches Objekt zurück. Das ist praktisch zum Loggen oder um die Daten per postMessage() bzw. an einen Analyse-Endpunkt zu senden.
Einsatzbereiche sind Anwendungen, die ihre Last an die Systemauslastung anpassen, etwa Videokonferenzen (weniger Videokacheln, niedrigere Auflösung), Spiele (einfachere Effekte) oder Editoren (seltenere Live-Vorschau). Die Zustände sind absichtlich grob gehalten. Sie verraten keine exakten CPU-Werte, damit sich Nutzer nicht darüber identifizieren lassen (Fingerprinting).
Rückgabewert
PressureObserver oder über PressureObserver.prototype.takeRecords(). Eigenschaften: source (string), state ("nominal" | "fair" | "serious" | "critical") und time (DOMHighResTimeStamp).Beispiele
CPU-Druck beobachten und Einträge ausgeben
if ('PressureObserver' in globalThis) {
const observer = new PressureObserver((records) => {
for (const record of records) {
console.log(`${record.source}: ${record.state} @ ${record.time.toFixed(0)} ms`);
}
});
try {
// sampleInterval: gewünschter Mindestabstand zwischen Messungen in ms
await observer.observe('cpu', { sampleInterval: 1000 });
} catch (err) {
console.warn('Compute Pressure nicht erlaubt:', err.name);
}
} else {
console.log('Compute Pressure API wird nicht unterstützt.');
}
Videoqualität an den Druckzustand anpassen
const qualityByState = {
nominal: { width: 1280, fps: 30 },
fair: { width: 960, fps: 30 },
serious: { width: 640, fps: 24 },
critical: { width: 320, fps: 15 }
};
const applyQuality = ({ width, fps }) => {
console.log(`Setze Video auf ${width}px / ${fps} fps`);
// hier z. B. track.applyConstraints({ width, frameRate: fps })
};
const observer = new PressureObserver((records) => {
// Nur der jüngste Eintrag ist relevant
const latest = records.at(-1);
applyQuality(qualityByState[latest.state]);
});
await observer.observe('cpu', { sampleInterval: 2000 });
Einträge per toJSON() serialisieren und mit takeRecords() abholen
const log = [];
const observer = new PressureObserver((records) => {
log.push(...records.map((r) => r.toJSON()));
});
await observer.observe('cpu');
// Später, z. B. beim Verlassen der Seite
addEventListener('pagehide', () => {
// Noch nicht zugestellte Einträge einsammeln
const pending = observer.takeRecords().map((r) => r.toJSON());
observer.disconnect();
navigator.sendBeacon('/telemetry/pressure', JSON.stringify([...log, ...pending]));
});
console.log(JSON.stringify(log[0]));
// Wichtig · Fallstricke
Experimentell: Die API gibt es nur in Chromium-Browsern ab Version 125 (Desktop). Firefox und Safari unterstützen sie nicht. Prüfe vor der Nutzung immer mit 'PressureObserver' in globalThis, ob sie vorhanden ist. PressureObserver.knownSources nennt die unterstützten Quellen.
- Die API funktioniert nur in einem sicheren Kontext (HTTPS). Sie steht in
Windowsowie in dedizierten und geteilten Workern zur Verfügung. - In iframes muss die Permissions Policy
compute-pressuregesetzt sein (z. B.<iframe allow="compute-pressure">). Sonst schlägtobserve()mitNotAllowedErrorfehl. - Einträge kommen nur, wenn die Seite sichtbar ist bzw. den Fokus hat. Hintergrund-Tabs bekommen in der Regel keine Updates.
- Die Zustände sind grob und absichtlich ungenau. Der Browser kann Einträge verzögern oder zusammenfassen, und
sampleIntervalist nur ein Wunsch, keine Garantie. Leite daraus keine exakten Prozentwerte oder Benchmarks ab. - Die Eigenschaften sind schreibgeschützt.
timeist relativ zuperformance.timeOriginund kein Unix-Zeitstempel. Für absolute Zeit rechneperformance.timeOrigin + record.time. - Pass deine Anpassungen mit Hysterese an: Reagiere z. B. nicht auf jeden kurzen Wechsel zwischen
fairundserious, sonst flackert die Qualität.