From 63b038e469c7a5f680fa5927bc29c42eab76091d Mon Sep 17 00:00:00 2001 From: pku-xht Date: Fri, 21 Aug 2026 02:59:09 +0800 Subject: [PATCH] fix(subprocess): preserve close snapshot state --- packages/subprocess/subprocess-local/src/runner-launch.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/subprocess/subprocess-local/src/runner-launch.ts b/packages/subprocess/subprocess-local/src/runner-launch.ts index 725d5e2fbe..453b7cb76b 100644 --- a/packages/subprocess/subprocess-local/src/runner-launch.ts +++ b/packages/subprocess/subprocess-local/src/runner-launch.ts @@ -115,20 +115,19 @@ async function waitForDirectResult( missingResult?: () => SubprocessOutcome | undefined, ): Promise { let seen = 0 - let wrapperClosed = false - void closed.then(() => { wrapperClosed = true }) + const wrapperState = { closed: false } + void closed.then(() => { wrapperState.closed = true }) for (;;) { // A read started before close may return a stale snapshot after close has // become visible. Only a read started after close can prove no terminal // event was written before the runner exited. - const closedBeforeRead = wrapperClosed + const closedBeforeRead = wrapperState.closed const events = await readRunnerEventsAsync(files.eventsPath) for (const event of events.slice(seen)) { if (event.type === 'exit') return { exitCode: event.exitCode, signal: event.signal } if (event.type === 'spawn-error' || event.type === 'runner-error') throw deserializeSpawnError(event.error) } seen = Math.max(seen, events.length, initial.length) - // oxlint-disable-next-line typescript/no-unnecessary-condition -- child close mutates this flag asynchronously. if (closedBeforeRead) { const known = missingResult?.() if (known !== undefined) return known