fix(producer): type video extraction failures

This commit is contained in:
James
2026-07-26 19:47:33 +00:00
parent 814f9cd977
commit 9b63646c8a
12 changed files with 1009 additions and 59 deletions
+21
View File
@@ -118,6 +118,23 @@ interface PreparedRenderInput {
}
const DEFAULT_SERVER_FPS = { num: 30, den: 1 } as const;
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
* code from the message: it may contain local paths or signed source URLs.
*/
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;
}
function parseServerFps(value: unknown): RenderInput["fps"] {
if (typeof value !== "number" && typeof value !== "string") return DEFAULT_SERVER_FPS;
@@ -524,6 +541,7 @@ async function writeRenderStreamFailure(input: {
return;
}
const errorMsg = error instanceof Error ? error.message : String(error);
const errorCode = extractSafeRenderErrorCode(error);
const elapsedMs = Date.now() - startedAtMs;
log.error("render-stream failed", {
requestId,
@@ -536,6 +554,7 @@ async function writeRenderStreamFailure(input: {
type: "error",
requestId,
error: errorMsg,
errorCode,
stage: job.currentStage,
elapsedMs,
errorDetails: job.errorDetails ?? null,
@@ -684,6 +703,7 @@ export function createRenderHandlers(options: HandlerOptions = {}): RenderHandle
} catch (error) {
const durationMs = Date.now() - t0;
const errorMsg = error instanceof Error ? error.message : String(error);
const errorCode = extractSafeRenderErrorCode(error);
log.error("render failed", {
requestId,
durationMs,
@@ -695,6 +715,7 @@ export function createRenderHandlers(options: HandlerOptions = {}): RenderHandle
success: false,
requestId,
error: errorMsg,
errorCode,
stage: job.currentStage,
durationMs,
errorDetails: job.errorDetails ?? null,