fix(app): avoid hashing image preview payloads

This commit is contained in:
Mohamed Boudra
2026-04-22 23:15:28 +07:00
parent 339a0b6b43
commit ce6393a933
3 changed files with 20 additions and 7 deletions

View File

@@ -55,9 +55,10 @@ export function parseImageDataUrl(
if (!parsed.mimeType.toLowerCase().startsWith("image/")) {
return null;
}
const fingerprint = `${parsed.mimeType}\0${parsed.base64.length}\0${parsed.base64.slice(0, 64)}\0${parsed.base64.slice(-64)}`;
return {
...parsed,
cacheKey: `data-image:${parsed.mimeType}:${parsed.base64.length}:${hashString(parsed.base64)}`,
cacheKey: `data-image:${parsed.mimeType}:${parsed.base64.length}:${hashString(fingerprint)}`,
};
} catch {
return null;
@@ -80,13 +81,18 @@ export function getFileNameFromPath(path: string | null | undefined): string | n
}
export function createPreviewAttachmentId(input: {
base64: string;
mimeType: string;
path?: string | null;
size?: number | null;
modifiedAt?: string | null;
contentLength?: number | null;
}): string {
const path = input.path?.trim() ?? "";
const hash = hashString(`${input.mimeType}\0${path}\0${input.base64}`);
return `preview_${input.base64.length}_${hash}`;
const size = Number.isFinite(input.size) ? String(input.size) : "";
const modifiedAt = input.modifiedAt?.trim() ?? "";
const contentLength = Number.isFinite(input.contentLength) ? String(input.contentLength) : "";
const hash = hashString(`${input.mimeType}\0${path}\0${size}\0${modifiedAt}\0${contentLength}`);
return `preview_${size || contentLength || "unknown"}_${hash}`;
}
export async function blobToBase64(blob: Blob): Promise<string> {

View File

@@ -76,9 +76,11 @@ async function createFilePanePreview(file: ExplorerFile | null): Promise<{
const { content: _content, ...imageFile } = file;
const imageAttachment = await persistAttachmentFromBase64({
id: createPreviewAttachmentId({
base64: file.content,
mimeType: file.mimeType ?? "image/png",
path: file.path,
size: file.size,
modifiedAt: file.modifiedAt,
contentLength: file.content.length,
}),
base64: file.content,
mimeType: file.mimeType,

View File

@@ -635,9 +635,11 @@ function AssistantMarkdownImage({
return await persistAttachmentFromBase64({
id: createPreviewAttachmentId({
base64: file.content,
mimeType: file.mimeType ?? "image/png",
path: file.path || resolution.path,
size: file.size,
modifiedAt: file.modifiedAt,
contentLength: file.content.length,
}),
base64: file.content,
mimeType: file.mimeType,
@@ -655,7 +657,10 @@ function AssistantMarkdownImage({
}
return await persistAttachmentFromDataUrl({
id: createPreviewAttachmentId(dataImage),
id: createPreviewAttachmentId({
mimeType: dataImage.mimeType,
contentLength: dataImage.base64.length,
}),
dataUrl: source,
mimeType: dataImage.mimeType,
});