Files
hyperframes/packages/cli/src/renderSetupWorker.ts
T

56 lines
1.7 KiB
TypeScript

import { constants, setPriority } from "node:os";
import { ensureBrowser, releaseOwnedBrowserInstallLock } from "./browser/manager.js";
import { lintProject } from "./utils/lintProject.js";
import { killOrphanedProcesses } from "./utils/orphanCleanup.js";
import {
installRenderSetupSignalHandlers,
renderSetupErrorLine,
renderSetupResultLine,
} from "./renderSetupWorkerLifecycle.js";
const mode = process.argv[2];
const input = JSON.parse(process.env.HYPERFRAMES_RENDER_SETUP_INPUT ?? "{}");
const disposeSignalHandlers = installRenderSetupSignalHandlers(
process,
releaseOwnedBrowserInstallLock,
(signal) => process.kill(process.pid, signal),
process.env.HYPERFRAMES_RENDER_DETACHED !== "1",
);
function lowerPriority(): void {
try {
setPriority(constants.priority.PRIORITY_LOW);
} catch (error) {
process.stderr.write(`Lint runs at normal priority: ${(error as Error).message}\n`);
}
}
async function runMode(): Promise<unknown> {
if (mode === "browser") return ensureBrowser(input);
if (mode === "lint") {
// Nobody waits on a background lint the way they wait on a Studio boot, so it takes idle CPU only.
lowerPriority();
return lintProject(
input.projectDir,
input.entryFile,
input.host ? { host: input.host } : undefined,
);
}
if (mode === "orphan-cleanup") {
const killed = killOrphanedProcesses();
if (killed > 0) await new Promise((resolve) => setTimeout(resolve, 600));
return killed;
}
throw new Error(`Unknown render setup mode: ${mode}`);
}
try {
const result = await runMode().finally(disposeSignalHandlers);
process.stdout.write(renderSetupResultLine(result));
} catch (error) {
process.stderr.write(renderSetupErrorLine(error), () => {
throw error;
});
}