[eric] browser: settle-aware in-batch wait and a terminal read sub-action

This commit is contained in:
ciregenz
2026-06-04 04:04:44 -07:00
parent 21d8c6cba1
commit 27686e270b
4 changed files with 122 additions and 27 deletions
+30
View File
@@ -0,0 +1,30 @@
// Renderer-side mirror of the backend's smart-wait (browser_wait.py): a `wait`
// that returns the instant the page's network goes quiet instead of blind-sleeping
// the full duration. A top-level BrowserWait already gets this on the backend, but
// a `wait` INSIDE a BrowserBatch runs entirely here in the renderer, so without
// this it would fall back to a dumb sleep and make batching slower than not batching.
export const SETTLE_FLOOR_MS = 250; // never settle before this (a momentary gap isn't 'settled')
export const SETTLE_QUIET_MS = 400; // network must be silent this long to count as settled
export const SETTLE_POLL_MS = 150;
// One probe: is the document complete, and how long since the last network resource
// finished/started? Returns a JSON string. No interpolation, so it's injection-safe.
export const SETTLE_PROBE_JS =
"(()=>{const n=performance.now();" +
"const es=performance.getEntriesByType('resource');let last=0;" +
"for(const e of es){const t=Math.max(e.responseEnd||0,e.startTime||0);if(t>last)last=t;}" +
"return JSON.stringify({ready:document.readyState==='complete',quiet:Math.round(n-last)});})()";
// Pure decision: stop waiting once we're past the floor AND the document is complete
// AND the network has been quiet for the settle window.
export function shouldStopWaiting(
ready: boolean,
quietMs: number,
elapsedMs: number,
floorMs = SETTLE_FLOOR_MS,
quietWindowMs = SETTLE_QUIET_MS,
): boolean {
if (elapsedMs < floorMs) return false;
return !!ready && (quietMs || 0) >= quietWindowMs;
}