baa-conductor


baa-conductor / apps / conductor-daemon / src
codex@macbookpro  ·  2026-03-31

execution-timeouts.ts

 1export const DEFAULT_BAA_INSTRUCTION_TIMEOUT_MS = 30_000;
 2export const DEFAULT_BAA_EXEC_INSTRUCTION_TIMEOUT_MS = 60_000;
 3
 4export const DEFAULT_BROWSER_PROXY_TIMEOUT_MS = 20_000;
 5export const DEFAULT_BROWSER_PROXY_ACTION_RESULT_TIMEOUT_GRACE_MS = 5_000;
 6
 7export const DEFAULT_BAA_DELIVERY_ACTION_TIMEOUT_MS = 15_000;
 8export const DEFAULT_BAA_DELIVERY_ACTION_RESULT_TIMEOUT_MS = 20_000;
 9
10export const DEFAULT_RENEWAL_EXECUTION_TIMEOUT_MS = DEFAULT_BROWSER_PROXY_TIMEOUT_MS;
11
12export const DEFAULT_FIREFOX_API_REQUEST_TIMEOUT_MS = 15_000;
13export const DEFAULT_FIREFOX_ACTION_RESULT_TIMEOUT_MS = 10_000;
14export const DEFAULT_FIREFOX_STREAM_IDLE_TIMEOUT_MS = 30_000;
15export const DEFAULT_FIREFOX_STREAM_MAX_BUFFERED_BYTES = 512 * 1024;
16export const DEFAULT_FIREFOX_STREAM_MAX_BUFFERED_EVENTS = 256;
17export const DEFAULT_FIREFOX_STREAM_OPEN_TIMEOUT_MS = 10_000;
18
19export function resolveDeliveryActionResultTimeoutMs(timeoutMs?: number | null): number {
20  return timeoutMs == null
21    ? DEFAULT_BAA_DELIVERY_ACTION_RESULT_TIMEOUT_MS
22    : timeoutMs + DEFAULT_BROWSER_PROXY_ACTION_RESULT_TIMEOUT_GRACE_MS;
23}
24
25export async function withAbortableTimeout<T>(
26  timeoutMs: number,
27  createTimeoutError: () => Error,
28  work: (signal: AbortSignal) => Promise<T>
29): Promise<T> {
30  const controller = new AbortController();
31
32  return await new Promise<T>((resolve, reject) => {
33    let settled = false;
34    const timeoutId = globalThis.setTimeout(() => {
35      const timeoutError = createTimeoutError();
36      controller.abort(timeoutError);
37
38      if (settled) {
39        return;
40      }
41
42      settled = true;
43      reject(timeoutError);
44    }, timeoutMs);
45
46    const finish = (handler: () => void) => {
47      if (settled) {
48        return;
49      }
50
51      settled = true;
52      globalThis.clearTimeout(timeoutId);
53      handler();
54    };
55
56    void Promise.resolve().then(() => work(controller.signal)).then(
57      (value) => {
58        finish(() => {
59          resolve(value);
60        });
61      },
62      (error) => {
63        finish(() => {
64          reject(error);
65        });
66      }
67    );
68  });
69}