+44
@@ -0,0 +1,44 @@
|
||||
/** Wall-clock + idle abort for QVAC completion streams. No Bare imports. */
|
||||
|
||||
function attachCompleteWatch(opts) {
|
||||
opts = opts || {};
|
||||
const timeoutMs = Number(opts.timeoutMs) > 0 ? Number(opts.timeoutMs) : 0;
|
||||
const idleMs = Number(opts.idleMs) > 0 ? Number(opts.idleMs) : 0;
|
||||
const abort = opts.abort;
|
||||
let timedOut = false;
|
||||
let wall = null;
|
||||
let idle = null;
|
||||
|
||||
function clear() {
|
||||
if (wall) clearTimeout(wall);
|
||||
if (idle) clearTimeout(idle);
|
||||
wall = null;
|
||||
idle = null;
|
||||
}
|
||||
|
||||
function fire() {
|
||||
if (timedOut) return;
|
||||
timedOut = true;
|
||||
clear();
|
||||
try {
|
||||
if (typeof abort === 'function') abort();
|
||||
} catch (_) {}
|
||||
if (typeof opts.onTimeout === 'function') opts.onTimeout();
|
||||
}
|
||||
|
||||
if (timeoutMs) wall = setTimeout(fire, timeoutMs);
|
||||
|
||||
function bump() {
|
||||
if (timedOut || !(idleMs > 0)) return;
|
||||
if (idle) clearTimeout(idle);
|
||||
idle = setTimeout(fire, idleMs);
|
||||
}
|
||||
|
||||
return {
|
||||
bump,
|
||||
clear,
|
||||
timedOut: () => timedOut,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { attachCompleteWatch };
|
||||
Reference in New Issue
Block a user