v151 · performance · resilience

The reliability gap

Three live experiments on the gap the proposal exists to close: whether this browser exposes the proposed session-end entry type, proof that an abruptly-terminated context loses its final message, and the shipped API that narrows the gap today — fetchLater().

1 · Probe the proposed surface

The explainer defines a new PerformanceSessionEndTiming entry (entryType: "session-end"). If Chrome ever ships it, it must appear in PerformanceObserver.supportedEntryTypes — the exact list this button reads.

Not probed yet.

2 · Watch a final beacon get lost

A worker stands in for a page whose renderer is killed. Its final telemetry is a real network POST to this site's reporting endpoint: graceful shutdown lets that beacon reach the server, while worker.terminate() — like an OOM kill — destroys the context before the send is ever reached, so the endpoint provably never receives it (the table's verdict comes from querying the endpoint, not from the worker's own claims). That is precisely how real OOM kills lose telemetry: the code that would have sent the beacon simply never runs, and JavaScript cannot report its own death.

No run yet.
RunProgress messagesFinal beacon at the endpoint?
No runs recorded.

3 · Today's best answer: fetchLater()

Until the header ships, fetchLater() is the most reliable way to get end-of-session data out: the browser owns the deferred request and sends it even if the tab is closed. This button feature-detects and schedules a real deferred beacon to this site's reporting endpoint (it is delivered when you leave this page).

Not scheduled. fetchLater support has not been probed yet.

code path

// 1 — the future probe (can flip to true when Chrome ships the proposal)
PerformanceObserver.supportedEntryTypes.includes('session-end');

// 3 — the shipped mitigation (check for the NATIVE API: a page shim or
// polyfill assigned to window.fetchLater is not browser-owned delivery)
if (typeof fetchLater === 'function' && String(fetchLater).includes('[native code]')) {
  fetchLater('../report', { method: 'POST',
    headers: { 'content-type': 'application/json' },
    body: JSON.stringify({ type: 'fetchlater-session-beacon', … }) });
}

see also