Files
heygen-com__hyperframes/packages/aws-lambda/scripts/_formatBytes.ts
T

16 lines
702 B
TypeScript
Raw Normal View History

feat(lambda): add Lambda handler, ZIP bundling, and BeginFrame probe (#878) * feat(lambda): add Lambda handler, ZIP bundling, and BeginFrame probe Phase 6 of the distributed rendering plan: AWS Lambda turnkey adoption (see DISTRIBUTED-RENDERING-PLAN.md §11 Phase 6 + §15). This PR adds the new packages/aws-lambda/ workspace package that wraps the OSS plan/renderChunk/assemble primitives in an AWS Lambda handler, plus a build pipeline that bundles the handler + Chromium runtime + ffmpeg into a deployable ZIP. Architecture: ZIP deploy (not Docker image), Chrome via @sparticuz/chromium with chrome-headless-shell fallback, dispatch on event.Action ∈ {plan, renderChunk, assemble}. The load-bearing concern — does @sparticuz/chromium's chrome-headless-shell build honour CDP HeadlessExperimental.beginFrame? — is pinned by the new scripts/probe-beginframe.ts regression guard. Probe boots the runtime inside public.ecr.aws/lambda/nodejs:22, navigates to a static page, and asserts beginFrame returns a PNG buffer. Verified locally + inside the Docker container; both pass with hasDamage=true. Sizes (sparticuz source): unzipped 157 MiB, zipped 99 MiB. Well under the 240 MiB / 150 MiB in-house gates and the Lambda 250 MiB hard ceiling. This is part of a stack of 8 PRs (3 in Phase 6a, 5 in Phase 6b); this is PR 6.1. * fix(lambda): address PR 878 review feedback - Verify event.PlanHash against the untarred plan.json at the handler boundary before invoking the producer primitive. Throws typed PLAN_HASH_MISMATCH on divergence so Step Functions routes it as non-retryable; previously the field was schema bloat the handler ignored, leaving enforcement entirely inside the producer. - Standardize on MiB throughout build-zip.ts, verify-zip-size.ts, and the README. Lambda's hard ceiling is 250 MiB (AWS docs label "250 MB" but use binary mebibytes); previously mixed units made the 248 MiB budget look like a ~5 MB margin instead of the 2 MiB it actually is. - stageChromeHeadlessShell now picks Chrome versions via numeric semver comparison instead of lexicographic sort+reverse — the latter would silently pick "99.x" over "131.x" once Chrome cached three-digit majors that aren't width-aligned. - Drop _setSparticuzChromiumForTests from the public index barrel. Test-only DI seam imported directly from ./chromium.js in tests. - Replace require("node:fs") inside walkSize() with the top-level fs imports — file is ESM and the same module is already imported. * docs(lambda): drop internal plan-doc refs from package README * ci(windows): fix bun filter UNION bug excluding producer from Windows tests `bun run --filter "!a" --filter "!b" test` composes as a UNION (any package matching either negation runs), not an intersection. Effect: @hyperframes/producer was still being tested on Windows even though it's explicitly excluded — its regression harness (Docker + LFS golden mp4 baselines) is Linux-only and was driving the 32min timeout. Enumerate the packages we DO want to test instead.
2026-05-16 18:08:47 -04:00
/**
* Shared binary-unit byte formatter for the build/verify scripts.
*
* The Lambda ZIP-size budget is in mebibytes (Lambda's 250 MB / 248 MiB
* gate is binary, not decimal), so logs and CI failure messages use
* KiB / MiB / GiB. This is intentionally a different unit system from
* `packages/cli/src/ui/format.ts`'s `formatBytes` (KB / MB, decimal) —
* don't conflate them.
*/
export function formatBytes(bytes: number): string {
if (bytes < 1024) return `${bytes} B`;
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KiB`;
if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GiB`;
}