All files / lib/internal/cluster utils.js

100% Statements 51/51
100% Branches 16/16
100% Functions 3/3
100% Lines 51/51

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 5276x 76x 76x 76x 76x 76x 76x 76x 76x 76x 76x 76x 76x 76x 76x 970x 970x 970x 968x 968x 968x 968x 968x 968x 970x 968x 968x 968x 970x 76x 76x 76x 495x 495x 1140x 1140x 994x 994x 994x 1127x 237x 237x 237x 236x 236x 236x 237x 994x 994x 495x 495x  
'use strict';
 
const {
  ReflectApply,
  SafeMap,
} = primordials;
 
module.exports = {
  sendHelper,
  internal
};
 
const callbacks = new SafeMap();
let seq = 0;
 
function sendHelper(proc, message, handle, cb) {
  if (!proc.connected)
    return false;
 
  // Mark message as internal. See INTERNAL_PREFIX
  // in lib/internal/child_process.js
  message = { cmd: 'NODE_CLUSTER', ...message, seq };
 
  if (typeof cb === 'function')
    callbacks.set(seq, cb);
 
  seq += 1;
  return proc.send(message, handle);
}
 
// Returns an internalMessage listener that hands off normal messages
// to the callback but intercepts and redirects ACK messages.
function internal(worker, cb) {
  return function onInternalMessage(message, handle) {
    if (message.cmd !== 'NODE_CLUSTER')
      return;
 
    let fn = cb;
 
    if (message.ack !== undefined) {
      const callback = callbacks.get(message.ack);
 
      if (callback !== undefined) {
        fn = callback;
        callbacks.delete(message.ack);
      }
    }
 
    ReflectApply(fn, worker, arguments);
  };
}