er.emit("fork", worker); } cluster.disconnect = function(cb) { if (ObjectKeys(cluster.workers).length === 0) process.nextTick(() => intercom.emit("disconnect")); else for (let worker of ObjectValues(cluster.workers)) if (worker.isConnected()) worker.disconnect(); if (typeof cb === "function") intercom.once("disconnect", cb); }; var methodMessageMapping = { close, exitedAfterDisconnect, listening, online, queryServer }; function onmessage(message, _handle) { let worker = this, fn = methodMessageMapping[message.act]; if (typeof fn === "function") fn(worker, message); } function online(worker) { worker.state = "online", worker.emit("online"), cluster.emit("online", worker); } function exitedAfterDisconnect(worker, message) { worker.exitedAfterDisconnect = !0, send(worker, { ack: message.seq }); } function queryServer(worker, message) { if (worker.exitedAfterDisconnect) return; let key = `${message.address}:${message.port}:${message.addressType}:${message.fd}:${message.index}`, handle = handles.get(key); if (handle === @undefined) { let address = message.address; if (message.port < 0 && typeof address === "string") { if (address = path.relative(process.cwd(), address), message.address.length < address.length) address = message.address; } if (schedulingPolicy !== 2 || message.addressType === "udp4" || message.addressType === "udp6") throwNotImplemented("node:cluster SCHED_NONE"); else handle = new RoundRobinHandle(key, address, message); handles.set(key, handle); } if (!handle.data) handle.data = message.data; handle.add(worker, (errno, reply, handle2) => { let { data } = handles.get(key); if (errno) handles.delete(key); send(worker, { errno, key, ack: message.seq, data, ...reply }, handle2); }); } function listening(worker, message) { let info = { addressType: message.addressType, address: message.address, port: message.port, fd: message.fd }; worker.state = "listening", worker.emit("listening", info), cluster.emit("listening", worker, info); } function close(worker, message) { let key = message.key, handle = handles.get(key); if (handle && handle.remove(worker)) handles.delete(key); } function send(worker, message, handle, cb) { return sendHelper(worker.process[kHandle], message, handle, cb); } Worker.prototype.disconnect = function() { return this.exitedAfterDisconnect = !0, send(this, { act: "disconnect" }), this.process.disconnect(), removeHandlesForWorker(this), removeWorker(this), this; }; Worker.prototype.destroy = function(signo) { let proc = this.process, signal = signo || "SIGTERM"; proc.kill(signal); }; return $})