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

  1. Verify the video bridge broker service version matches the client's expected result schema (durationSeconds + frames array)
  2. Log the raw broker payload (truncated) to identify which field violated the contract
  3. Retry the extraction once in case the broker returned a transient partial response
  4. 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)