mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-14 22:54:01 -06:00
d9d2d2482d
* fix(agents): harden code mode lifecycle and deadlines * fix(agents): retain narrowed headless settlement frontier
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
/** Race preparation and bridge work against the same guest-owned deadline. */
|
|
export async function awaitCodeModeDeadline<T>(params: {
|
|
operation: () => Promise<T>;
|
|
deadlineMs: number;
|
|
signal?: AbortSignal;
|
|
createTimeoutError: () => Error;
|
|
createAbortError: (signal: AbortSignal) => Error;
|
|
}): Promise<T> {
|
|
const remainingMs = params.deadlineMs - Date.now();
|
|
if (remainingMs <= 0) {
|
|
throw params.createTimeoutError();
|
|
}
|
|
if (params.signal?.aborted) {
|
|
throw params.createAbortError(params.signal);
|
|
}
|
|
|
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
let onAbort: (() => void) | undefined;
|
|
try {
|
|
const deadline = new Promise<never>((_resolve, reject) => {
|
|
timer = setTimeout(() => reject(params.createTimeoutError()), remainingMs);
|
|
const signal = params.signal;
|
|
if (signal) {
|
|
onAbort = () => reject(params.createAbortError(signal));
|
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
if (signal.aborted) {
|
|
onAbort();
|
|
}
|
|
}
|
|
});
|
|
return await Promise.race([params.operation(), deadline]);
|
|
} finally {
|
|
if (timer) {
|
|
clearTimeout(timer);
|
|
}
|
|
if (params.signal && onAbort) {
|
|
params.signal.removeEventListener("abort", onAbort);
|
|
}
|
|
}
|
|
}
|