const v8 = require('node:v8');
/**
* @module pete/lib/reporters/process
*/
module.exports = createSender;
/**
* Create and return report function that sends output to parent Node.js process.
*
* @see {@link https://nodejs.org/api/process.html#process_process_send_message_sendhandle_options_callback}
* @alias module:pete/lib/reporters/process
* @return {module:pete/lib/getReporters~report}
*/
function createSender () {
if (!process.send) {
return null;
}
return send;
}
/**
* @private
* @param {Error|null} err
* @param {module:pete/lib/createReport~Report} report
*/
function send (err, report) {
if (!err && !report) {
return;
}
process.send({
error : (err && err.stack) || null,
report: v8.serialize(report).toString('base64'),
types : getTypes(report)
});
}
/**
* @private
* @param {module:pete/lib/createReport~Report|object} obj
*/
function getTypes (obj) {
return Object.keys(obj).reduce((types, key) => {
if (!obj[key]) {
return types;
}
if (typeof obj[key] !== 'object') {
return types;
}
if (obj[key].constructor.name === 'NanoTime') {
types.NanoTime = types.NanoTime || [];
types.NanoTime.push(key);
}
return types;
}, {});
}