All files / lib/internal/process signal.js

94.44% Statements 51/54
90.9% Branches 10/11
100% Functions 3/3
94.44% Lines 51/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5525x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 17015x 17015x 17015x 25x 25x 17015x 17015x 224x 224x 224x 224x 224x 224x 224x 224x 224x 224x 224x       224x 224x 224x 17015x 25x 591x 591x 591x 38x 38x 38x 591x 25x 25x 25x 25x 25x  
'use strict';
 
const {
  FunctionPrototypeBind,
  SafeMap,
} = primordials;
 
const {
  errnoException,
} = require('internal/errors');
 
const { signals } = internalBinding('constants').os;
 
let Signal;
const signalWraps = new SafeMap();
 
function isSignal(event) {
  return typeof event === 'string' && signals[event] !== undefined;
}
 
// Detect presence of a listener for the special signal types
function startListeningIfSignal(type) {
  if (isSignal(type) && !signalWraps.has(type)) {
    if (Signal === undefined)
      Signal = internalBinding('signal_wrap').Signal;
    const wrap = new Signal();
 
    wrap.unref();
 
    wrap.onsignal = FunctionPrototypeBind(process.emit, process, type, type);
 
    const signum = signals[type];
    const err = wrap.start(signum);
    if (err) {
      wrap.close();
      throw errnoException(err, 'uv_signal_start');
    }
 
    signalWraps.set(type, wrap);
  }
}
 
function stopListeningIfSignal(type) {
  const wrap = signalWraps.get(type);
  if (wrap !== undefined && process.listenerCount(type) === 0) {
    wrap.close();
    signalWraps.delete(type);
  }
}
 
module.exports = {
  startListeningIfSignal,
  stopListeningIfSignal
};