From c01e1a5f96839e1a2650516ceb3745ed7b28517f Mon Sep 17 00:00:00 2001 From: James Date: Sun, 26 Jul 2026 18:05:10 +0000 Subject: [PATCH] fix(producer): narrow extraction error shapes honestly --- packages/engine/src/services/videoFrameExtractor.ts | 4 ++-- packages/producer/src/server.ts | 11 ++++------- .../services/render/stages/extractVideosStage.test.ts | 7 +++++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/engine/src/services/videoFrameExtractor.ts b/packages/engine/src/services/videoFrameExtractor.ts index b27e13797..fe96e0d53 100644 --- a/packages/engine/src/services/videoFrameExtractor.ts +++ b/packages/engine/src/services/videoFrameExtractor.ts @@ -198,8 +198,8 @@ export function isVideoSourceExtractionError(error: unknown): error is VideoSour return ( typeof error === "object" && error !== null && - (error as { hyperframesVideoSourceExtractionError?: unknown }) - .hyperframesVideoSourceExtractionError === true + "hyperframesVideoSourceExtractionError" in error && + error.hyperframesVideoSourceExtractionError === true ); } diff --git a/packages/producer/src/server.ts b/packages/producer/src/server.ts index da85b89e0..9a3a2f88c 100644 --- a/packages/producer/src/server.ts +++ b/packages/producer/src/server.ts @@ -118,10 +118,10 @@ interface PreparedRenderInput { } const DEFAULT_SERVER_FPS = { num: 30, den: 1 } as const; -const SAFE_RENDER_ERROR_CODES = new Set([ +const SAFE_RENDER_ERROR_CODES = new Set([ "VIDEO_SOURCE_UNRENDERABLE", "VIDEO_EXTRACTION_FAILED", -] as const); +]); /** * Preserve only bounded producer error codes across JSON/SSE. Never derive a @@ -129,11 +129,8 @@ const SAFE_RENDER_ERROR_CODES = new Set([ */ export function extractSafeRenderErrorCode(error: unknown): string | undefined { if (typeof error !== "object" || error === null || !("code" in error)) return undefined; - const code = (error as { code?: unknown }).code; - return typeof code === "string" && - SAFE_RENDER_ERROR_CODES.has(code as "VIDEO_SOURCE_UNRENDERABLE" | "VIDEO_EXTRACTION_FAILED") - ? code - : undefined; + const code = error.code; + return typeof code === "string" && SAFE_RENDER_ERROR_CODES.has(code) ? code : undefined; } function parseServerFps(value: unknown): RenderInput["fps"] { diff --git a/packages/producer/src/services/render/stages/extractVideosStage.test.ts b/packages/producer/src/services/render/stages/extractVideosStage.test.ts index 2933c400e..10c36426d 100644 --- a/packages/producer/src/services/render/stages/extractVideosStage.test.ts +++ b/packages/producer/src/services/render/stages/extractVideosStage.test.ts @@ -193,8 +193,11 @@ describe("assertVideoExtractionSucceeded", () => { { kind: "zero_output", count: 1 }, ], }); - expect((caught as Error).message).not.toContain("/tmp/"); - expect((caught as Error).message).not.toContain("Signature"); + if (!(caught instanceof Error)) { + throw new Error("expected VideoExtractionStageError"); + } + expect(caught.message).not.toContain("/tmp/"); + expect(caught.message).not.toContain("Signature"); }); it("keeps exhausted transient failures retryable and collapses duplicate kinds", () => {