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