{"record":{"id":"28ccdda8247bf8a9","repo":"diegosouzapw/OmniRoute","slug":"contact-sheet-requires-jpeg-data-uris","errorCode":null,"errorMessage":"Contact sheet requires JPEG data URIs","messagePattern":"Contact sheet requires JPEG data URIs","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/lib/guardrails/videoBridgeContactSheet.ts","lineNumber":40,"sourceCode":"const MAX_FRAMES = 16;\nconst MAX_SHEET_BYTES = 32 * 1024 * 1024;\nconst LABEL_FONT_SIZE = 32;\nconst LABEL_HEIGHT = 64;\nconst LABEL_PADDING = 16;\nconst TILE_SIZE = 512;\n\nfunction fallback(frames: readonly ContactSheetFrame[]): VideoContactSheetResult {\n  return {\n    fallbackReason: \"CONTACT_SHEET_UNAVAILABLE\",\n    frames: frames.map((frame) => ({ ...frame })),\n    timestamps: frames.map((frame) => frame.timestampSeconds),\n    used: false,\n  };\n}\n\nfunction decodeFrame(dataUri: string): Buffer {\n  const match = /^data:image\\/jpeg;base64,([A-Za-z0-9+/=]{4,5592408})$/i.exec(dataUri);\n  if (!match) throw new Error(\"Contact sheet requires JPEG data URIs\");\n  return Buffer.from(match[1], \"base64\");\n}\n\nfunction formatContactSheetTimestamp(timestampSeconds: number): string {\n  const totalMilliseconds = Math.max(0, Math.round(timestampSeconds * 1000));\n  const minutes = Math.floor(totalMilliseconds / 60_000);\n  const seconds = Math.floor((totalMilliseconds % 60_000) / 1000);\n  const milliseconds = totalMilliseconds % 1000;\n  if (minutes > 999) return `t=${timestampSeconds.toExponential(3)}s`;\n  return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n}\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\" />","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/diegosouzapw/OmniRoute/blob/a179ffed5bb2e0b883b9ae7214ce8717b2a94c4d/src/lib/guardrails/videoBridgeContactSheet.ts#L22-L58","documentation":"Error \"Contact sheet requires JPEG data URIs\" thrown in diegosouzapw/OmniRoute.","triggerScenarios":"Thrown at src/lib/guardrails/videoBridgeContactSheet.ts:40 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"}