@@ -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+
15381546export 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
15471558export 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