mirror of
https://github.com/oven-sh/bun
synced 2026-02-13 12:29:07 +00:00
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> Co-authored-by: nektro <nektro@users.noreply.github.com> Co-authored-by: cirospaciari <ciro.spaciari@gmail.com>
77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
"use strict";
|
|
const common = require("../common");
|
|
if (common.isWindows) return; // TODO: bun
|
|
const assert = require("assert");
|
|
const child_process = require("child_process");
|
|
const cluster = require("cluster");
|
|
|
|
if (!process.argv[2]) {
|
|
// It seems Windows only allocate new console window for
|
|
// attaching processes spawned by detached processes. i.e.
|
|
// - If process D is spawned by process C with `detached: true`,
|
|
// and process W is spawned by process D with `detached: false`,
|
|
// W will get a new black console window popped up.
|
|
// - If D is spawned by C with `detached: false` or W is spawned
|
|
// by D with `detached: true`, no console window will pop up for W.
|
|
//
|
|
// So, we have to spawn a detached process first to run the actual test.
|
|
const primary = child_process.spawn(process.argv[0], [process.argv[1], "--cluster"], {
|
|
detached: true,
|
|
stdio: ["ignore", "ignore", "ignore", "ipc"],
|
|
});
|
|
|
|
const messageHandlers = {
|
|
workerOnline: common.mustCall(),
|
|
mainWindowHandle: common.mustCall(msg => {
|
|
assert.match(msg.value, /0\s*/);
|
|
}),
|
|
workerExit: common.mustCall(msg => {
|
|
assert.strictEqual(msg.code, 0);
|
|
assert.strictEqual(msg.signal, null);
|
|
}),
|
|
};
|
|
|
|
primary.on("message", msg => {
|
|
const handler = messageHandlers[msg.type];
|
|
assert.ok(handler);
|
|
handler(msg);
|
|
});
|
|
|
|
primary.on(
|
|
"exit",
|
|
common.mustCall((code, signal) => {
|
|
assert.strictEqual(code, 0);
|
|
assert.strictEqual(signal, null);
|
|
}),
|
|
);
|
|
} else if (cluster.isPrimary) {
|
|
cluster.setupPrimary({
|
|
silent: true,
|
|
windowsHide: true,
|
|
});
|
|
|
|
const worker = cluster.fork();
|
|
worker.on("exit", (code, signal) => {
|
|
process.send({ type: "workerExit", code: code, signal: signal });
|
|
});
|
|
|
|
worker.on("online", msg => {
|
|
process.send({ type: "workerOnline" });
|
|
|
|
let output = "0";
|
|
if (process.platform === "win32") {
|
|
output = child_process.execSync(
|
|
"powershell -NoProfile -c " + `"(Get-Process -Id ${worker.process.pid}).MainWindowHandle"`,
|
|
{ windowsHide: true, encoding: "utf8" },
|
|
);
|
|
}
|
|
|
|
process.send({ type: "mainWindowHandle", value: output });
|
|
worker.send("shutdown");
|
|
});
|
|
} else {
|
|
cluster.worker.on("message", msg => {
|
|
cluster.worker.disconnect();
|
|
});
|
|
}
|