signal-manager.js 812 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. const runningProcs = new Set()
  2. let handlersInstalled = false
  3. const forwardedSignals = [
  4. 'SIGINT',
  5. 'SIGTERM'
  6. ]
  7. const handleSignal = signal => {
  8. for (const proc of runningProcs) {
  9. proc.kill(signal)
  10. }
  11. }
  12. const setupListeners = () => {
  13. for (const signal of forwardedSignals) {
  14. process.on(signal, handleSignal)
  15. }
  16. handlersInstalled = true
  17. }
  18. const cleanupListeners = () => {
  19. if (runningProcs.size === 0) {
  20. for (const signal of forwardedSignals) {
  21. process.removeListener(signal, handleSignal)
  22. }
  23. handlersInstalled = false
  24. }
  25. }
  26. const add = proc => {
  27. runningProcs.add(proc)
  28. if (!handlersInstalled)
  29. setupListeners()
  30. proc.once('exit', () => {
  31. runningProcs.delete(proc)
  32. cleanupListeners()
  33. })
  34. }
  35. module.exports = {
  36. add,
  37. handleSignal,
  38. forwardedSignals
  39. }