From 85bcbcc348dec7074a70cbfb77a1b13f38e4bab9 Mon Sep 17 00:00:00 2001 From: Michail Strokin Date: Thu, 2 Jan 2025 22:07:08 +0300 Subject: [PATCH] Destroy read only stream to make sure there are no open files left --- packages/node/src/integrations/contextlines.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/node/src/integrations/contextlines.ts b/packages/node/src/integrations/contextlines.ts index 5e1bd75913c9..7380e82bbdc0 100644 --- a/packages/node/src/integrations/contextlines.ts +++ b/packages/node/src/integrations/contextlines.ts @@ -141,6 +141,11 @@ function getContextLinesFromFile(path: string, ranges: ReadlineRange[], output: const lineReaded = createInterface({ input: stream, }); + + function destroyStreamAndResolve(): void { + stream.destroy(); + resolve(); + } // Init at zero and increment at the start of the loop because lines are 1 indexed. let lineNumber = 0; @@ -148,12 +153,11 @@ function getContextLinesFromFile(path: string, ranges: ReadlineRange[], output: const range = ranges[currentRangeIndex]; if (range === undefined) { // We should never reach this point, but if we do, we should resolve the promise to prevent it from hanging. - resolve(); + destroyStreamAndResolve(); return; } let rangeStart = range[0]; let rangeEnd = range[1]; - // We use this inside Promise.all, so we need to resolve the promise even if there is an error // to prevent Promise.all from short circuiting the rest. function onStreamError(e: Error): void { @@ -162,14 +166,14 @@ function getContextLinesFromFile(path: string, ranges: ReadlineRange[], output: DEBUG_BUILD && logger.error(`Failed to read file: ${path}. Error: ${e}`); lineReaded.close(); lineReaded.removeAllListeners(); - resolve(); + destroyStreamAndResolve(); } // We need to handle the error event to prevent the process from crashing in < Node 16 // https://github.com/nodejs/node/pull/31603 stream.on('error', onStreamError); lineReaded.on('error', onStreamError); - lineReaded.on('close', resolve); + lineReaded.on('close', destroyStreamAndResolve); lineReaded.on('line', line => { lineNumber++;