| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- const runningProcs = new Set()
- let handlersInstalled = false
- // NOTE: these signals aren't actually forwarded anywhere. they're trapped and
- // ignored until all child processes have exited. in our next breaking change
- // we should rename this
- const forwardedSignals = [
- 'SIGINT',
- 'SIGTERM',
- ]
- // no-op, this is so receiving the signal doesn't cause us to exit immediately
- // instead, we exit after all children have exited when we re-send the signal
- // to ourselves. see the catch handler at the bottom of run-script-pkg.js
- // istanbul ignore next - this function does nothing
- const handleSignal = () => {}
- const setupListeners = () => {
- for (const signal of forwardedSignals) {
- process.on(signal, handleSignal)
- }
- handlersInstalled = true
- }
- const cleanupListeners = () => {
- if (runningProcs.size === 0) {
- for (const signal of forwardedSignals) {
- process.removeListener(signal, handleSignal)
- }
- handlersInstalled = false
- }
- }
- const add = proc => {
- runningProcs.add(proc)
- if (!handlersInstalled) {
- setupListeners()
- }
- proc.once('exit', () => {
- runningProcs.delete(proc)
- cleanupListeners()
- })
- }
- module.exports = {
- add,
- handleSignal,
- forwardedSignals,
- }
|