lib/reporters/process.js

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;
	}, {});
}