mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-11-03 04:07:03 +00:00
* perf(producer): multi-worker mp4 renders start encoding while frames are still being captured On the multi-worker disk capture path the encoder used to start only after every worker had finished. It now starts with capture and is fed frame 0, 1, 2... in order as each frame file lands, with the same encoder arguments, so the output is byte-identical and the encode left after capture is shorter. Off for drawElement capture (a failed self-check discards every frame) and for png/gif/webm/mov/HDR/GPU/chunked/HLS output. If the overlapped encode fails, the frames are encoded after capture exactly as before. * perf(producer): encode during capture only when a core is spare for the encoder With every core busy capturing, the encoder only slowed capture down, so the overlap now runs only when the render uses fewer workers than the CPU count worker sizing sees. Also pins the reviewed producer test-lane source hash and drops an added comment line. * refactor(producer): shorter comments on the encode-while-capturing helpers
99 lines
4.2 KiB
JavaScript
99 lines
4.2 KiB
JavaScript
// fallow-ignore-file complexity
|
|
import { readdirSync, readFileSync } from "node:fs";
|
|
import { dirname, relative, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
export const PRODUCER_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
|
|
// These tests need host capabilities such as Chrome, ffmpeg, worker threads,
|
|
// or local sockets. Keep the list explicit so a filename-only rename does not
|
|
// make Git/fallow re-audit thousands of unchanged test lines as new code.
|
|
const INTEGRATION_TEST_FILES = new Set([
|
|
"tests/distributed/_smoke/webm-concat-copy.test.ts",
|
|
"tests/playback-rate-av-parity/playback-rate-av-parity.test.ts",
|
|
"src/regression-harness-psnr.test.ts",
|
|
"src/services/bundleScriptPolicy.test.ts",
|
|
"src/services/coreRuntimeBrowser.test.ts",
|
|
"src/services/vfxDeterminism.test.ts",
|
|
"src/services/distributed/assemble.test.ts",
|
|
"src/services/distributed/chunkBoundary.test.ts",
|
|
"src/services/distributed/crossWorkerIdempotency.test.ts",
|
|
"src/services/distributed/plan.masterBus.test.ts",
|
|
"src/services/distributed/plan.test.ts",
|
|
"src/services/distributed/planSizeCap.test.ts",
|
|
"src/services/distributed/planV2RemoteFiles.test.ts",
|
|
"src/services/distributed/renderChunk.test.ts",
|
|
"src/services/fileServer.test.ts",
|
|
"src/services/fileServer.file-race.test.ts",
|
|
"src/services/healthWorker.test.ts",
|
|
"src/services/scriptFailureAttribution.test.ts",
|
|
"src/services/hyperframeLint.file-race.test.ts",
|
|
"src/services/assetMediaType.test.ts",
|
|
"src/services/htmlCompiler.mediaType.test.ts",
|
|
"src/services/htmlCompiler.naturalDuration.test.ts",
|
|
"src/services/render/firstFrameStartingState.integration.test.ts",
|
|
"src/services/render/hlsRender.integration.test.ts",
|
|
"src/services/render/motionBlurVideo.integration.test.ts",
|
|
"src/services/render/renderCancel.integration.test.ts",
|
|
"src/services/render/segmentedColorGrading.integration.test.ts",
|
|
"src/services/render/stages/compileStage.mediaType.test.ts",
|
|
"src/services/render/stages/encodeWhileCapturing.test.ts",
|
|
"src/services/render/stages/gifEncodeArgs.test.ts",
|
|
"src/services/videoFrameBorderClip.test.ts",
|
|
"src/utils/audioRegression.test.ts",
|
|
"src/utils/streamDurationParity.test.ts",
|
|
]);
|
|
|
|
function collectTestFiles(directory, files = []) {
|
|
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
const entryPath = resolve(directory, entry.name);
|
|
if (entry.isDirectory()) collectTestFiles(entryPath, files);
|
|
else if (entry.isFile() && entry.name.endsWith(".test.ts")) files.push(entryPath);
|
|
}
|
|
return files;
|
|
}
|
|
|
|
export function classifyTestSource(filePath, source, integrationFiles = INTEGRATION_TEST_FILES) {
|
|
const importsBun = /\bfrom\s+["']bun:test["']/.test(source);
|
|
const importsVitest = /\bfrom\s+["']vitest["']/.test(source);
|
|
if (importsBun === importsVitest) {
|
|
const detail = importsBun ? "imports both bun:test and vitest" : "imports neither runner";
|
|
throw new Error(`${filePath}: ${detail}`);
|
|
}
|
|
return {
|
|
file: filePath,
|
|
runner: importsBun ? "bun" : "vitest",
|
|
lane: integrationFiles.has(filePath) ? "integration" : "unit",
|
|
};
|
|
}
|
|
|
|
export function discoverProducerTests(producerRoot = PRODUCER_ROOT) {
|
|
const roots = ["src", "tests"].map((directory) => resolve(producerRoot, directory));
|
|
const files = roots
|
|
.flatMap((directory) => collectTestFiles(directory))
|
|
.map((absolutePath) => ({
|
|
absolutePath,
|
|
filePath: relative(producerRoot, absolutePath).replaceAll("\\", "/"),
|
|
}));
|
|
const discoveredFiles = new Set(files.map((test) => test.filePath));
|
|
const staleEntries = [...INTEGRATION_TEST_FILES].filter((file) => !discoveredFiles.has(file));
|
|
if (staleEntries.length > 0) {
|
|
throw new Error(`Integration test manifest contains missing files: ${staleEntries.join(", ")}`);
|
|
}
|
|
return files
|
|
.map(({ absolutePath, filePath }) => {
|
|
return classifyTestSource(filePath, readFileSync(absolutePath, "utf8"));
|
|
})
|
|
.sort((left, right) => left.file.localeCompare(right.file));
|
|
}
|
|
|
|
export function summarizeTests(tests) {
|
|
const summary = {
|
|
total: tests.length,
|
|
unit: { bun: 0, vitest: 0 },
|
|
integration: { bun: 0, vitest: 0 },
|
|
};
|
|
for (const test of tests) summary[test.lane][test.runner] += 1;
|
|
return summary;
|
|
}
|