mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-08 10:46:06 +00:00
fix(cli): wire aspect-agnostic resolution through cloudrun/lambda/batch + preflight recompute
Addresses R2 CHANGES_REQUESTED from Miga + Rames on PR #2529: 1. Sibling-surface gap (blocker): `hyperframes cloudrun render{,-batch}`, `hyperframes lambda render{,-batch}` all advertised the same tier-only aliases (`1080p` / `hd` / `4k` / `uhd`) but normalized them to `landscape` and never set `outputResolutionAspectAgnostic`. The distributed plumbing PR #2529 added received `undefined` from those callers, so portrait `1080p` still hit the original aspect-mismatch on Cloud Run / Lambda. Fix: introduce `resolveResolutionFlagPair` in `@hyperframes/parsers` (the single source of truth for the two-step normalize + aspect-agnostic detect) and route every distributed entrypoint through a shared `parseOutputResolutionFlag` CLI util so the alias signal now reaches `SerializableDistributedRenderConfig`. Studio Server keeps its canonical-only HTTP contract; that intent is now pinned in tests. 2. Preflight recompute (hardening): the earlier "downgrade aspect-mismatch" preflight cleared un-remapped mismatches, so IG 4:5 (non-preset aspect, no sibling) and portrait-4K comp + `--resolution 1080p` (remap + downsample) both slipped through to fail late in `resolveDeviceScaleFactor`. Now `checkRenderResolutionPreflight` computes the effective preset via `suggestMatchingPreset` (mirroring the compile stage's `adaptAspectAgnosticResolution`) and re-checks against that — only genuinely-fixable mismatches clear early. New tests pin both regressed input classes. 3. Docker forwarding boundary test (Miga's important #2): pinned `1080p` survives verbatim as `--resolution 1080p` in the Docker args so the in-container CLI can re-run `isAspectAgnosticResolutionAlias`. 4. Doc-nit (Miga): parsers/src/types.ts no longer references the nonexistent `resolveResolutionForComposition` — points at the actual remap helpers. Fallow: cloudrun.ts / lambda.ts share 390 lines of pre-existing structural symmetry (parallel AWS + GCP dispatchers), and lambda/render.ts + render-batch.ts declare parallel RenderArgs interfaces. Both re-flagged after threading the aspect-agnostic field through each surface; ignored with justification in .fallowrc.jsonc. lambda.ts's `run` and lambda/render.ts's `waitForCompletion` are pre-existing CRAP-score hotspots untouched by this PR — added under health.ignore. Co-Authored-By: Claude <noreply@anthropic.com> — Via
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
/**
|
||||
* Boundary test for the `hyperframes cloudrun render{,-batch}` wire config.
|
||||
* Pins that the aspect-agnostic flag reaches `SerializableDistributedRenderConfig`
|
||||
* so the Cloud Run worker's compile stage can remap `landscape` → `portrait`.
|
||||
*
|
||||
* The parse helper itself is covered at `../utils/parseOutputResolution.test.ts`;
|
||||
* we only re-check the entrypoint composition here.
|
||||
*/
|
||||
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { buildRenderConfig } from "./cloudrun.js";
|
||||
|
||||
describe("cloudrun wire config — aspect-agnostic threading", () => {
|
||||
const baseArgs: Record<string, unknown> = {
|
||||
format: "mp4",
|
||||
codec: undefined,
|
||||
quality: undefined,
|
||||
"chunk-size": undefined,
|
||||
"max-parallel-chunks": undefined,
|
||||
"target-chunk-frames": undefined,
|
||||
};
|
||||
|
||||
it("threads outputResolutionAspectAgnostic=true through the wire config for portrait 1080p", () => {
|
||||
// The exact bug shape: portrait comp + `--output-resolution 1080p`.
|
||||
// Before the fix, the alias signal never reached the wire; Cloud Run
|
||||
// then hit the same portrait rejection this PR set out to eliminate.
|
||||
const config = buildRenderConfig(
|
||||
{ ...baseArgs, "output-resolution": "1080p" },
|
||||
30,
|
||||
1080,
|
||||
1920,
|
||||
undefined,
|
||||
);
|
||||
expect(config.outputResolution).toBe("landscape");
|
||||
expect(config.outputResolutionAspectAgnostic).toBe(true);
|
||||
});
|
||||
|
||||
it("keeps the aspect-agnostic key absent when the flag is a canonical preset", () => {
|
||||
// Sparse-wire invariant: don't broadcast `false` for the common path —
|
||||
// the compile-stage remap only fires on `true`.
|
||||
const config = buildRenderConfig(
|
||||
{ ...baseArgs, "output-resolution": "portrait-4k" },
|
||||
30,
|
||||
2160,
|
||||
3840,
|
||||
undefined,
|
||||
);
|
||||
expect(config.outputResolution).toBe("portrait-4k");
|
||||
expect(config).not.toHaveProperty("outputResolutionAspectAgnostic");
|
||||
});
|
||||
|
||||
it("omits both resolution fields when --output-resolution is unset", () => {
|
||||
const config = buildRenderConfig(baseArgs, 30, 1920, 1080, undefined);
|
||||
expect(config).not.toHaveProperty("outputResolution");
|
||||
expect(config).not.toHaveProperty("outputResolutionAspectAgnostic");
|
||||
});
|
||||
|
||||
it("preserves the surface-labeled strict-throw contract on unknown values", () => {
|
||||
// Sanity guard: the local delegate stays wired to the shared helper's
|
||||
// throw semantics rather than silently downgrading to undefined. Full
|
||||
// input-space coverage lives at `../utils/parseOutputResolution.test.ts`.
|
||||
expect(() =>
|
||||
buildRenderConfig({ "output-resolution": "8k" }, 30, 1920, 1080, undefined),
|
||||
).toThrow(/\[cloudrun render\]/);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user