Skip to content

Commit 710a424

Browse files
authored
fix: properly hide relaySignal from process.listeners() (#741)
1 parent 20b91c4 commit 710a424

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/preflight.cts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ const bindHiddenSignalsHandler = (
1010
handler: NodeJS.SignalsListener,
1111
) => {
1212
type RelaySignals = typeof signals[number];
13+
14+
const hiddenHandlers = new Map<RelaySignals, NodeJS.SignalsListener>();
1315
for (const signal of signals) {
14-
process.on(signal, (receivedSignal) => {
16+
const hiddenHandler = (receivedSignal: NodeJS.Signals) => {
1517
handler(receivedSignal);
1618

1719
/**
@@ -22,7 +24,10 @@ const bindHiddenSignalsHandler = (
2224
// eslint-disable-next-line n/no-process-exit
2325
process.exit(128 + osConstants.signals[signal]);
2426
}
25-
});
27+
};
28+
29+
process.on(signal, hiddenHandler);
30+
hiddenHandlers.set(signal, hiddenHandler);
2631
}
2732

2833
/**
@@ -41,7 +46,9 @@ const bindHiddenSignalsHandler = (
4146
process.listeners = function (eventName) {
4247
const result: BaseEventListener[] = Reflect.apply(listeners, this, arguments);
4348
if (signals.includes(eventName as RelaySignals)) {
44-
return result.filter(listener => listener !== handler);
49+
return result.filter(
50+
listener => listener !== hiddenHandlers.get(eventName as RelaySignals),
51+
);
4552
}
4653
return result;
4754
};

tests/specs/cli.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ export default testSuite(({ describe }, node: NodeApis) => {
178178
});
179179
setTimeout(() => {}, 1e5);
180180
`,
181+
'hidden-signals-handler.js': `
182+
console.log('process.listeners().length = ' + process.listeners('SIGINT').length);
183+
console.log('process.listenerCount() = ' + process.listenerCount('SIGINT'));
184+
`,
181185
});
182186
onFinish(async () => await fixture.rm());
183187

@@ -306,6 +310,17 @@ export default testSuite(({ describe }, node: NodeApis) => {
306310
retry: 3,
307311
});
308312

313+
test('Relay signal handlers are properly hidden', async () => {
314+
const tsxProcess = tsx([
315+
fixture.getPath('hidden-signals-handler.js'),
316+
]);
317+
318+
const result = await tsxProcess;
319+
320+
expect(result.stdout).toBe('process.listeners().length = 0\nprocess.listenerCount() = 0');
321+
expect(result.exitCode).toBe(0);
322+
});
323+
309324
describe('Ctrl + C', ({ test }) => {
310325
const CtrlC = '\u0003';
311326

0 commit comments

Comments
 (0)