feat(studio-server): transcode bounded H.264 proxies on demand (#2589)

* feat(studio-server): bound the proxy cache with LRU accounting

Adds cache accounting and bounded cleanup for transcoded proxies, and keeps
.transcode-cache out of git. Standalone: the transcoder consumes it next.

* feat(studio-server): transcode bounded H.264 proxies on demand

Adds the proxy transcoder: a bounded work queue with per-key dedupe, a hard
kill ceiling, TTL'd failure memory so a broken asset is not retried forever,
and pixel/color normalization for browser playback. Writes through a temp name
and renames on success, so a cache entry is never partial.

Carries a TEMP fallow ignoreExports entry: this module lands below its
consumers, so a per-PR audit sees its exports as unused until the preview weld
arrives. The entry is dropped there.
This commit is contained in:
Miguel Ángel
2026-07-16 21:08:03 -04:00
committed by GitHub
parent 1d3d20450d
commit 9d148d288a
3 changed files with 965 additions and 0 deletions
+23
View File
@@ -145,6 +145,29 @@
"file": "packages/studio/src/utils/studioHelpers.ts",
"exports": ["resolveDroppedAssetDimensions"],
},
// TEMP (transparent-proxy stack): proxyTranscoder is carved in below its
// consumers, which land upstack (mediaProxyPreview + the preview route,
// then the CLI surfaces). With no importer yet, a per-PR audit against the
// merge base sees the module's whole export surface as unused. Same shape
// as the drawElementService entry below. Safe to drop once the preview
// weld lands; the stack's final slice greps for zero TEMP entries.
{
"file": "packages/studio-server/src/helpers/proxyTranscoder.ts",
"exports": [
"PROXY_PARAMS_VERSION",
"TRANSCODE_TIMEOUT_MS",
"DEFAULT_PROXY_WAIT_TIMEOUT_MS",
"ProxyTranscodeError",
"FfmpegMissingFilterError",
"ProxyCapacityError",
"ProxySourceOutsideProjectError",
"ProxyWaitTimeoutError",
"waitForProxy",
"getProxyCachePath",
"clearFailedTranscodesForTest",
"resolveProxy",
],
},
// drawElementService is the bottom of the fast-capture Graphite stack
// (#1917): its consumers (frameCapture in #1919) land two PRs upstack, so
// a per-PR audit diffing against the merge base sees these exports as