• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const {
4  Map,
5} = primordials;
6
7module.exports = {
8  sendHelper,
9  internal
10};
11
12const callbacks = new Map();
13let seq = 0;
14
15function sendHelper(proc, message, handle, cb) {
16  if (!proc.connected)
17    return false;
18
19  // Mark message as internal. See INTERNAL_PREFIX in lib/child_process.js
20  message = { cmd: 'NODE_CLUSTER', ...message, seq };
21
22  if (typeof cb === 'function')
23    callbacks.set(seq, cb);
24
25  seq += 1;
26  return proc.send(message, handle);
27}
28
29// Returns an internalMessage listener that hands off normal messages
30// to the callback but intercepts and redirects ACK messages.
31function internal(worker, cb) {
32  return function onInternalMessage(message, handle) {
33    if (message.cmd !== 'NODE_CLUSTER')
34      return;
35
36    let fn = cb;
37
38    if (message.ack !== undefined) {
39      const callback = callbacks.get(message.ack);
40
41      if (callback !== undefined) {
42        fn = callback;
43        callbacks.delete(message.ack);
44      }
45    }
46
47    fn.apply(worker, arguments);
48  };
49}
50