@@ -1535,20 +1535,34 @@ export function partialEncodeURIPath(uri: string): string {
1535
1535
return filePath . replaceAll ( '%' , '%25' ) + postfix
1536
1536
}
1537
1537
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
+
1538
1546
export const setupSIGTERMListener = (
1539
1547
callback : ( signal ?: 'SIGTERM' , exitCode ?: number ) => Promise < void > ,
1540
1548
) : 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
+ }
1544
1554
}
1555
+ sigtermCallbacks . add ( callback )
1545
1556
}
1546
1557
1547
1558
export const teardownSIGTERMListener = (
1548
1559
callback : Parameters < typeof setupSIGTERMListener > [ 0 ] ,
1549
1560
) : 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
+ }
1553
1567
}
1554
1568
}
0 commit comments