diegosouzapw/OmniRoute · error
Video extraction broker returned an invalid frame
Error message
Video extraction broker returned an invalid frame
What it means
Validation guard in parseBrokerResult: the broker's JSON result payload did not satisfy the expected shape — durationSeconds is missing/non-finite/<=0 or frames is not an array, or the frames array length is outside 1..frameCount. Fires whenever the extraction broker returns malformed or out-of-contract data, so callers never process untrusted broker output.
Solutions
- Verify the video bridge broker service version matches the client's expected result schema (durationSeconds + frames array)
- Log the raw broker payload (truncated) to identify which field violated the contract
- Retry the extraction once in case the broker returned a transient partial response
- If the broker is persistently malformed, fall back to local frame extraction instead of the broker
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/lib/guardrails/videoBridgeBrokerClient.ts:103 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of diegosouzapw/OmniRoute@a179ffed5b (2026-08-25).
Data as JSON: /api/errors/9205fa9c187319c3.
Report an issue: GitHub.
Appendix: source
Thrown at src/lib/guardrails/videoBridgeBrokerClient.ts:103
function parseBrokerResult(value: unknown, frameCount: number): BrokerExtractionResult {
const record = value && typeof value === "object" ? (value as Record<string, unknown>) : null;
const durationSeconds = Number(record?.durationSeconds);
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0 || !Array.isArray(record?.frames)) {
throw new Error("Video extraction broker returned invalid metadata");
}
if (record.frames.length < 1 || record.frames.length > frameCount) {
throw new Error("Video extraction broker returned an invalid frame count");
}
const frames = record.frames.map((entry) => {
const frame = entry && typeof entry === "object" ? (entry as Record<string, unknown>) : null;
const timestampSeconds = Number(frame?.timestampSeconds);
const dataUri = typeof frame?.dataUri === "string" ? frame.dataUri : "";
if (
!Number.isFinite(timestampSeconds) ||
timestampSeconds < 0 ||
!/^data:image\/jpeg;base64,[A-Za-z0-9+/=]+$/.test(dataUri)
) {
throw new Error("Video extraction broker returned an invalid frame");
}
return { dataUri, timestampSeconds };
});
const samplingRecord =
record?.sampling && typeof record.sampling === "object"
? (record.sampling as Record<string, unknown>)
: {};
const policyRequested =
samplingRecord.policyRequested === "scene_aware" ||
samplingRecord.policyRequested === "segment_aware"
? samplingRecord.policyRequested
: "uniform";
const policyEffective =
samplingRecord.policyEffective === "scene_aware" ||
samplingRecord.policyEffective === "segment_aware"
? samplingRecord.policyEffective
: "uniform";
const candidateCount = Number(samplingRecord.candidateCount ?? 0);View on GitHub (pinned to a179ffed5b)