'use strict'; const common = require('../common'); const assert = require('assert'); const cluster = require('cluster'); const net = require('net'); const payload = 'a'.repeat(800004); if (cluster.isMaster) { const server = net.createServer(); server.on('connection', common.mustCall((socket) => { socket.unref(); })); const worker = cluster.fork(); worker.on('message', common.mustCall(({ payload: received }, handle) => { assert.strictEqual(payload, received); assert(handle instanceof net.Socket); server.close(); handle.destroy(); })); server.listen(0, common.mustCall(() => { const port = server.address().port; const socket = new net.Socket(); socket.connect(port, (err) => { assert.ifError(err); worker.send({ payload }, socket); }); })); } else { process.on('message', common.mustCall(({ payload: received }, handle) => { assert.strictEqual(payload, received); assert(handle instanceof net.Socket); // On macOS, the parent process might not receive a message if it is sent // to soon, and then subsequent messages are also sometimes not received. // // (Is this a bug or expected operating system behavior like the way a file // watcher is returned before it's actually watching the file system on // macOS?) // // Send a second message after a delay on macOS. // // Refs: https://github.com/nodejs/node/issues/14747 if (common.isOSX) setTimeout(() => { process.send({ payload }, handle); }, 1000); else process.send({ payload }, handle); // Prepare for a clean exit. process.channel.unref(); })); }