{"record":{"id":"e86e5d167bf692d2","repo":"diegosouzapw/OmniRoute","slug":"video-contact-sheet-was-aborted","errorCode":null,"errorMessage":"Video contact sheet was aborted","messagePattern":"Video contact sheet was aborted","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/lib/guardrails/videoBridgeContactSheet.ts","lineNumber":69,"sourceCode":"}\n\nfunction buildTimestampLabel(timestampSeconds: number): Buffer {\n  const label = formatContactSheetTimestamp(timestampSeconds);\n  const labelTop = TILE_SIZE - LABEL_HEIGHT;\n  return Buffer.from(\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${TILE_SIZE}\" height=\"${TILE_SIZE}\" viewBox=\"0 0 ${TILE_SIZE} ${TILE_SIZE}\">\n      <rect x=\"0\" y=\"${labelTop}\" width=\"${TILE_SIZE}\" height=\"${LABEL_HEIGHT}\" fill=\"#000000\" fill-opacity=\"0.82\" />\n      <text x=\"${LABEL_PADDING}\" y=\"${labelTop + 42}\" fill=\"#ffffff\" font-family=\"DejaVu Sans Mono, monospace\" font-size=\"${LABEL_FONT_SIZE}\" font-weight=\"700\">${label}</text>\n    </svg>`\n  );\n}\n\n/** Build an optional bounded JPEG grid; every failure except abort is fail-safe to individual frames. */\nexport async function buildVideoContactSheet(\n  frames: readonly ContactSheetFrame[],\n  options: ContactSheetOptions = {}\n): Promise<VideoContactSheetResult> {\n  if (options.signal?.aborted) throw new Error(\"Video contact sheet was aborted\");\n  if (frames.length < 1 || frames.length > MAX_FRAMES) return fallback(frames);\n  if (\n    frames.some(\n      (frame) =>\n        !Number.isFinite(frame.timestampSeconds) || frame.timestampSeconds < 0 || !frame.dataUri\n    )\n  ) {\n    return fallback(frames);\n  }\n  const columns = Math.min(4, Math.max(1, Math.floor(options.columns ?? 2)), frames.length);\n  const rows = Math.ceil(frames.length / columns);\n  const controller = new AbortController();\n  const timeout = options.timeoutMs\n    ? setTimeout(() => controller.abort(), options.timeoutMs)\n    : null;\n  const signal = options.signal\n    ? AbortSignal.any([options.signal, controller.signal])\n    : controller.signal;","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/diegosouzapw/OmniRoute/blob/a179ffed5bb2e0b883b9ae7214ce8717b2a94c4d/src/lib/guardrails/videoBridgeContactSheet.ts#L51-L87","documentation":"Error \"Video contact sheet was aborted\" thrown in diegosouzapw/OmniRoute.","triggerScenarios":"Thrown at src/lib/guardrails/videoBridgeContactSheet.ts:69 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a179ffed5bb2e0b883b9ae7214ce8717b2a94c4d","analyzedAt":"2026-08-25T18:35:09.898Z","schemaVersion":2},"datasetVersion":"2026-08-25T21:54:21.419Z"}