import type { PluginRestartDecision } from './plugin-supervisor' function cancellationError(): Error { return new Error('plugin worker activation was cancelled') } function waitForBackoff(delayMs: number, signal: AbortSignal): Promise { return new Promise((resolve, reject) => { const timer = setTimeout(() => { signal.removeEventListener('abort', onAbort) resolve() }, delayMs) timer.unref?.() function onAbort(): void { clearTimeout(timer) reject(cancellationError()) } signal.addEventListener('abort', onAbort, { once: true }) if (signal.aborted) { onAbort() } }) } export async function runPluginWorkerRestartLoop(options: { signal: AbortSignal firstRestart?: Extract assertActive: () => void start: () => Promise recordFailure: (error: unknown) => PluginRestartDecision erroredError: (error: unknown) => Error }): Promise { let restart = options.firstRestart for (;;) { if (restart) { await waitForBackoff(restart.delayMs, options.signal) } options.assertActive() try { return await options.start() } catch (error) { options.assertActive() const decision = options.recordFailure(error) if (!decision.restart) { throw options.erroredError(error) } restart = decision } } }