Skip to content

Commit 3671192

Browse files
committed
fix: improve telemetry worker stderr cleanup to prevent hanging
Replace setImmediate + destroy() with process.stderr.end() callback to ensure all buffered writes are flushed before exiting. Add fallback exit in finally block to prevent worker from hanging if end() fails. This properly releases the inherited stderr file descriptor in debug mode, preventing the parent process from being blocked.
1 parent ede6655 commit 3671192

1 file changed

Lines changed: 13 additions & 12 deletions

File tree

src/lib/analytics-telemetry/telemetry-worker.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@ const MAX_WORKER_LIFETIME_MS = 10000
1616
* This is important when stderr is inherited in DEBUG mode
1717
*/
1818
function exitWorker(code: number): void {
19-
// Use setImmediate to allow any pending stderr writes to flush
20-
// before destroying the stream
21-
setImmediate(() => {
22-
try {
23-
// Close stderr to release the file descriptor reference to parent
24-
process.stderr.destroy()
25-
} catch {
26-
// Ignore errors during cleanup
27-
}
28-
29-
process.exit(code)
30-
})
19+
try {
20+
// End stderr gracefully, flushing all pending writes
21+
// This properly releases the file descriptor reference to parent
22+
process.stderr.end(() => {
23+
process.exit(code)
24+
})
25+
} finally {
26+
// Fallback: ensure we exit even if end() fails or callback never fires
27+
// Use setImmediate to give the end() callback a chance to run first
28+
setImmediate(() => {
29+
process.exit(code)
30+
})
31+
}
3132
}
3233

3334
setTimeout(() => {

0 commit comments

Comments
 (0)