diff --git a/libs/platform/src/subprocess.ts b/libs/platform/src/subprocess.ts index ddfa220e..7d079863 100644 --- a/libs/platform/src/subprocess.ts +++ b/libs/platform/src/subprocess.ts @@ -97,7 +97,12 @@ export async function* spawnJSONLProcess(options: SubprocessOptions): AsyncGener } childProcess.kill('SIGTERM'); }; - abortController.signal.addEventListener('abort', abortHandler); + // Check if already aborted, if so call handler immediately + if (abortController.signal.aborted) { + abortHandler(); + } else { + abortController.signal.addEventListener('abort', abortHandler); + } } // Helper to clean up abort listener diff --git a/libs/platform/tests/subprocess.test.ts b/libs/platform/tests/subprocess.test.ts index 099d084d..47119cf0 100644 --- a/libs/platform/tests/subprocess.test.ts +++ b/libs/platform/tests/subprocess.test.ts @@ -245,7 +245,7 @@ describe('subprocess.ts', () => { const mockProcess = createMockProcess({ stdoutLines: ['{"type":"start"}'], exitCode: 0, - delayMs: 100, // Delay to allow abort + delayMs: 200, // Delay to allow abort }); vi.mocked(cp.spawn).mockReturnValue(mockProcess); @@ -258,8 +258,11 @@ describe('subprocess.ts', () => { // Start consuming the generator const promise = collectAsyncGenerator(generator); - // Abort after a short delay - setTimeout(() => abortController.abort(), 20); + // Abort after a short delay to ensure generator has started + // Use setImmediate to ensure the generator has started processing + setImmediate(() => { + abortController.abort(); + }); await promise;