fix(render): avoid Windows output path limit for work dirs (#2479)

This commit is contained in:
Miguel Ángel
2026-07-15 10:30:00 -04:00
committed by GitHub
parent 42055296ee
commit 882c203241
2 changed files with 23 additions and 1 deletions
@@ -27,6 +27,7 @@ import {
isRecoverableParallelCaptureError,
MAX_TRANSIENT_CAPTURE_RETRIES,
resolveCaptureForceScreenshotForPageSideCompositing,
resolveRenderWorkDirPrefix,
shouldDiscardProbeSessionForPageSideCompositing,
resolveInversionRetryPlan,
resolveParallelRouterRetryPlan,
@@ -57,6 +58,16 @@ import {
} from "./render/shared.js";
import { formatCaptureFrameName, toExternalAssetKey } from "../utils/paths.js";
describe("resolveRenderWorkDirPrefix", () => {
it("uses a short system temp prefix on Windows instead of the output path", () => {
const outputPath = win32.join("C:\\deep", "nested".repeat(30), "renders", "final.mp4");
expect(resolveRenderWorkDirPrefix(outputPath, "long-render-job-id", "win32", "C:/Temp")).toBe(
join("C:/Temp", "hf-render-"),
);
});
});
describe("extractStandaloneEntryFromIndex", () => {
it("reuses the index wrapper and keeps only the requested composition host", () => {
const indexHtml = `<!DOCTYPE html>
@@ -43,6 +43,7 @@ import {
copyFileSync,
appendFileSync,
} from "fs";
import { tmpdir } from "node:os";
import { parseHTML } from "linkedom";
import { type CanvasResolution, type Fps, type FpsInput, toFps } from "@hyperframes/core";
import {
@@ -726,6 +727,16 @@ export function getNextRetryWorkerCount(currentWorkers: number): number {
return Math.max(1, Math.floor(currentWorkers / 2));
}
export function resolveRenderWorkDirPrefix(
outputPath: string,
jobId: string,
platform: NodeJS.Platform = process.platform,
systemTempDir: string = tmpdir(),
): string {
if (platform === "win32") return join(systemTempDir, "hf-render-");
return join(dirname(outputPath), `work-${jobId}-`);
}
/**
* Bounded number of retries for transient browser deaths (a `Target closed` /
* `Page crashed` the tab died, not the composition). Distinct from the
@@ -1514,7 +1525,7 @@ export async function executeRenderJob(
if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });
const workDir = job.config.debug
? join(debugDir, job.id)
: mkdtempSync(join(outputDir, `work-${job.id}-`));
: mkdtempSync(resolveRenderWorkDirPrefix(outputPath, job.id));
const pipelineStart = Date.now();
const baseLog = job.config.logger ?? defaultLogger;
const logPath = job.config.debug ? join(workDir, "render.log") : null;