fix(producer): normalize error messages to prevent [object Object] in telemetry (#1099)

* fix(producer): normalize error messages to prevent [object Object] in telemetry

When a render fails and the caught value is a plain object (not an Error
instance), String(error) produces [object Object], masking the real error
in PostHog telemetry (~24 errors/day).

Add normalizeErrorMessage() that tries Error.message, string passthrough,
.message on plain objects, JSON.stringify, and String() as a last resort.
Apply it on the two telemetry-feeding paths: the main render failure
handler (renderOrchestrator.ts:2099) and buildRenderErrorDetails
(cleanup.ts), plus the error classifier isRecoverableParallelCaptureError
so timeout detection works even when the thrown value is a plain object.

* fix: address review — normalize CLI telemetry path, captureCost fallback

* fix: use local normalizeErrorMessage in CLI to avoid cross-package resolution

The Vite test runner can't resolve runtime imports from @hyperframes/producer
since its exports point to dist/. Copy the utility into the CLI package and
import locally instead.
This commit is contained in:
Miguel Ángel
2026-05-27 20:19:53 -04:00
committed by GitHub
parent 2d7b9e5245
commit d83a873986
8 changed files with 102 additions and 5 deletions
+2 -1
View File
@@ -49,6 +49,7 @@ import { bytesToMb } from "../telemetry/system.js";
import { VERSION } from "../version.js";
import { isDevMode } from "../utils/env.js";
import { buildDockerRunArgs } from "../utils/dockerRunArgs.js";
import { normalizeErrorMessage } from "../utils/errorMessage.js";
import type { RenderJob } from "@hyperframes/producer";
import {
normalizeResolutionFlag,
@@ -863,7 +864,7 @@ function handleRenderError(
docker: boolean,
hint: string,
): never {
const message = error instanceof Error ? error.message : String(error);
const message = normalizeErrorMessage(error);
trackRenderError({
fps: fpsToNumber(options.fps),
quality: options.quality,