From 6bbda219bb25ab771c1b86df7b7e34c8eb0b9124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Mon, 2 Nov 2026 04:41:07 +0000 Subject: [PATCH] fix(core): a smaller preview copy nobody wants any more no longer swaps in (#6973) * fix(core): a smaller preview copy nobody wants any more no longer swaps in * refactor(core): name the dropped copy instead of commenting it --- packages/core/src/runtime/mediaProxy.test.ts | 34 ++++++++++++++++++++ packages/core/src/runtime/mediaProxy.ts | 8 +++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/core/src/runtime/mediaProxy.test.ts b/packages/core/src/runtime/mediaProxy.test.ts index 5b72b91db7..4ce9f14927 100644 --- a/packages/core/src/runtime/mediaProxy.test.ts +++ b/packages/core/src/runtime/mediaProxy.test.ts @@ -1025,6 +1025,40 @@ describe("preview quality: lighter copies of heavy files", () => { delete (window as { __HF_MEDIA_SOURCE_FACTS__?: unknown }).__HF_MEDIA_SOURCE_FACTS__; }); + it("drops a smaller copy still being made when the level goes back up, so it never swaps in", async () => { + vi.useFakeTimers(); + let lowerMade = false; + vi.stubGlobal( + "fetch", + vi.fn(async (url: string) => + lowerMade || !String(url).includes("hf-proxy-box=1024") + ? new Response("x", { status: 206 }) + : new Response(null, { status: 202, headers: { "Retry-After": "2" } }), + ), + ); + const { video, setPreviewQuality, maybeProxyProactively } = await stage( + { "/video.mp4": HEAVY }, + { "/video.mp4": HEVC_ENTRY }, + ); + const { copiesReady } = await import("./previewCopies"); + const el = video(); + stubCanPlayType(el, ""); + maybeProxyProactively(el); + await vi.advanceTimersByTimeAsync(0); + expect(params(el).get("hf-proxy-box")).toBe("2048x1218"); + expect(el.load).toHaveBeenCalledTimes(1); + + setPreviewQuality(0.5); + await vi.advanceTimersByTimeAsync(0); + setPreviewQuality(1); + lowerMade = true; + await vi.advanceTimersByTimeAsync(60_000); + + expect(params(el).get("hf-proxy-box")).toBe("2048x1218"); + expect(el.load).toHaveBeenCalledTimes(1); + expect(copiesReady()).toBe(true); + }); + it("changes nothing at full quality", async () => { const { video, setPreviewQuality, maybeProxyProactively } = await stage({ "/video.mp4": HEAVY, diff --git a/packages/core/src/runtime/mediaProxy.ts b/packages/core/src/runtime/mediaProxy.ts index 4c0bbda2c7..7da61ffd4a 100644 --- a/packages/core/src/runtime/mediaProxy.ts +++ b/packages/core/src/runtime/mediaProxy.ts @@ -156,10 +156,14 @@ function keepSized(el: HTMLMediaElement, scale: number): void { if (needed && lowered && copy.light && lightCopyNoLongerNeeded(el, needed)) { return restoreOriginal(el); } - if (boxCovers(copy.box, needed, lowered)) return; + if (boxCovers(copy.box, needed, lowered)) return dropUnneededCopy(el); requestBox(el, copy, lowered || !needed ? needed : growOnly(needed, copy.box)); } +function dropUnneededCopy(el: HTMLMediaElement): void { + if (pendingUpgrades.delete(el)) noteCopy(el, "ready"); +} + function lightCopyNoLongerNeeded(el: HTMLMediaElement, needed: PreviewProxyBox): boolean { const facts = sourceFactsOf(el); return facts !== null && !isHeavyForPreview(facts, needed); @@ -193,7 +197,7 @@ function requestBox(el: HTMLMediaElement, copy: BoxedCopy, box: PreviewProxyBox void waitForServedProxy( href, wanted, - (fraction) => noteCopy(el, "making", fraction), + (fraction) => wanted() && noteCopy(el, "making", fraction), () => isActiveAtPlayhead(el), ).then((served) => { if (wanted()) noteCopy(el, served ? "ready" : "failed");