Skip to content

Commit 47039f4

Browse files
authoredJan 14, 2025··
fix: use shared sigterm callback (#19203)
1 parent 3bd55bc commit 47039f4

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed
 

‎packages/vite/src/node/utils.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -1535,20 +1535,34 @@ export function partialEncodeURIPath(uri: string): string {
15351535
return filePath.replaceAll('%', '%25') + postfix
15361536
}
15371537

1538+
type SigtermCallback = (signal?: 'SIGTERM', exitCode?: number) => Promise<void>
1539+
1540+
// Use a shared callback when attaching sigterm listeners to avoid `MaxListenersExceededWarning`
1541+
const sigtermCallbacks = new Set<SigtermCallback>()
1542+
const parentSigtermCallback: SigtermCallback = async (signal, exitCode) => {
1543+
await Promise.all([...sigtermCallbacks].map((cb) => cb(signal, exitCode)))
1544+
}
1545+
15381546
export const setupSIGTERMListener = (
15391547
callback: (signal?: 'SIGTERM', exitCode?: number) => Promise<void>,
15401548
): void => {
1541-
process.once('SIGTERM', callback)
1542-
if (process.env.CI !== 'true') {
1543-
process.stdin.on('end', callback)
1549+
if (sigtermCallbacks.size === 0) {
1550+
process.once('SIGTERM', parentSigtermCallback)
1551+
if (process.env.CI !== 'true') {
1552+
process.stdin.on('end', parentSigtermCallback)
1553+
}
15441554
}
1555+
sigtermCallbacks.add(callback)
15451556
}
15461557

15471558
export const teardownSIGTERMListener = (
15481559
callback: Parameters<typeof setupSIGTERMListener>[0],
15491560
): void => {
1550-
process.off('SIGTERM', callback)
1551-
if (process.env.CI !== 'true') {
1552-
process.stdin.off('end', callback)
1561+
sigtermCallbacks.delete(callback)
1562+
if (sigtermCallbacks.size === 0) {
1563+
process.off('SIGTERM', parentSigtermCallback)
1564+
if (process.env.CI !== 'true') {
1565+
process.stdin.off('end', parentSigtermCallback)
1566+
}
15531567
}
15541568
}

0 commit comments

Comments
 (0)
Please sign in to comment.