{"record":{"id":"90ce33dd4fb10f70","repo":"yikart/AiToEarn","slug":"failed-to-generate-combined-image","errorCode":null,"errorMessage":"Failed to generate combined image","messagePattern":"Failed to generate combined image","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"project/aitoearn-web/src/components/Chat/Share/generateShareImages.ts","lineNumber":38,"sourceCode":"  appUrl?: string\n  /** 分享链接（用于生成二维码） */\n  shareUrl?: string\n  /** 链接过期时间 */\n  expiresAt?: string\n}\n\nexport async function generateImageFromMessages(\n  messages: IDisplayMessage[],\n  userName?: string,\n  options?: GenerateImageOptions,\n): Promise<Blob[]> {\n  // 禁用语言自动切换，防止 ChatMessage 中的 useTransClient 改变全局语言\n  setDisableLanguageSwitch(true)\n\n  try {\n    const blob = await generateImageFromAllMessages(messages, userName, options)\n    if (!blob) {\n      throw new Error('Failed to generate combined image')\n    }\n    return [blob]\n  }\n  finally {\n    // 恢复语言切换功能\n    setDisableLanguageSwitch(false)\n  }\n}\n\nasync function generateImageFromAllMessages(\n  messages: IDisplayMessage[],\n  userName?: string,\n  options?: GenerateImageOptions,\n): Promise<Blob | null> {\n  // 处理消息中的媒体URL\n  const processedMessages = messages.map(message => ({\n    ...message,\n    medias:","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/yikart/AiToEarn/blob/d3aa8bea5b146a8675607cf0144d891aad3e9683/project/aitoearn-web/src/components/Chat/Share/generateShareImages.ts#L20-L56","documentation":" thrown by generateImageFromMessages in generateShareImages.ts when generateImageFromAllMessages resolves to a falsy blob (null/undefined) despite not throwing. The share-image pipeline (likely html-to-image rendering of chat messages) returned nothing, so the function rejects with 'Failed to generate combined image'.","triggerScenarios":"Calling generateImageFromMessages for long conversations where the rendered DOM node is empty, has zero dimensions, contains un-renderable content (cross-origin images, unsupported CSS), or html-to-image silently fails and resolves null.","commonSituations":"Very long chats exceeding canvas/browser size limits; chat messages containing images from other origins tainting the canvas; fonts/emoji rendering before load; memory pressure on mobile devices aborting rendering.","solutions":["Inspect generateImageFromAllMessages: make it throw with a cause instead of resolving null so the failure reason isn't lost.","Reduce rendered content: cap the number of messages rendered into the share image.","Ensure all images in messages are same-origin or CORS-enabled (crossOrigin='anonymous') before rendering.","Await document.fonts.ready and image load before invoking html-to-image.","Retry once on failure; canvas rendering is intermittently flaky under memory pressure."],"exampleFix":"// before\nconst blob = await generateImageFromAllMessages(messages, userName, options)\nif (!blob) throw new Error('Failed to generate combined image')\n// after\nawait document.fonts.ready\nconst blob = await generateImageFromAllMessages(messages.slice(-50), userName, options)\nif (!blob) throw new Error('Failed to generate combined image: renderer returned null')","handlingStrategy":"fallback","validationCode":"// sanity-check inputs before rendering\nif (!messages?.length) throw new Error('没有可生成的聊天记录')","typeGuard":"function isBlob(v: unknown): v is Blob {\n  return typeof Blob !== 'undefined' && v instanceof Blob && v.size > 0\n}","tryCatchPattern":"try {\n  const [blob] = await generateImageFromMessages(messages, userName)\n  if (!isBlob(blob)) throw new Error('生成结果为空')\n}\ncatch (e) {\n  showToast('分享图片生成失败，请减少聊天记录后重试')\n}","preventionTips":["Cap the number of messages rendered to avoid oversized canvases.","Ensure embedded images are CORS-enabled before html-to-image rendering.","Await document.fonts.ready before capture to avoid blank renders.","Have generateImageFromAllMessages throw with a cause instead of resolving null.","Retry once on null results — canvas rendering is intermittently flaky."],"tags":["image-generation","canvas","html-to-image","share"],"backgroundTag":"canvas-render-failed","analyzedSha":"d3aa8bea5b146a8675607cf0144d891aad3e9683","analyzedAt":"2026-08-31T14:19:24.185Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}