fix(editor): sanitize export finalizing progress

This commit is contained in:
wiiiii123
2026-05-22 22:16:04 +07:00
parent ac24952560
commit 3ad40f7764
2 changed files with 44 additions and 5 deletions
@@ -58,6 +58,43 @@ describe("resolveExportStatusModel", () => {
expect(status.isExportFinalSaveIndeterminate).toBe(true);
});
it("sanitizes invalid finalizing progress before rounding", () => {
const negativeStatus = resolveExportStatusModel({
isExporting: true,
exportProgress: progress({
phase: "finalizing",
renderProgress: -12.4,
}),
exportFormat: "mp4",
exportPipelineModel: "modern",
});
const infiniteStatus = resolveExportStatusModel({
isExporting: true,
exportProgress: progress({
phase: "finalizing",
renderProgress: Number.POSITIVE_INFINITY,
}),
exportFormat: "mp4",
exportPipelineModel: "modern",
});
const nanStatus = resolveExportStatusModel({
isExporting: true,
exportProgress: progress({
phase: "finalizing",
renderProgress: Number.NaN,
}),
exportFormat: "mp4",
exportPipelineModel: "modern",
});
expect(negativeStatus.exportFinalizingProgress).toBe(0);
expect(negativeStatus.exportFinalizingPercent).toBe(0);
expect(infiniteStatus.exportFinalizingProgress).toBe(0);
expect(infiniteStatus.exportFinalizingPercent).toBe(0);
expect(nanStatus.exportFinalizingProgress).toBe(0);
expect(nanStatus.exportFinalizingPercent).toBe(0);
});
it("keeps audio finalization out of the muxing-and-saving state", () => {
const status = resolveExportStatusModel({
isExporting: true,
@@ -35,12 +35,14 @@ export function resolveExportStatusModel({
const isExportFinalizing = exportProgress?.phase === "finalizing";
const isRenderingAudio =
isExportFinalizing && typeof exportProgress?.audioProgress === "number";
const rawFinalizingProgress =
typeof exportProgress?.renderProgress === "number"
? exportProgress.renderProgress
: (exportProgress?.percentage ?? 100);
const exportFinalizingProgress = isExportFinalizing
? Math.min(
typeof exportProgress?.renderProgress === "number"
? exportProgress.renderProgress
: (exportProgress?.percentage ?? 100),
100,
? Math.max(
0,
Math.min(100, Number.isFinite(rawFinalizingProgress) ? rawFinalizingProgress : 0),
)
: null;
const exportFinalizingPercent = isExportFinalizing