diff --git a/worker/src/server.js b/worker/src/server.js index 88e5a26..256ca2d 100644 --- a/worker/src/server.js +++ b/worker/src/server.js @@ -900,6 +900,57 @@ function parseDomEmojiUrl(value) { } } +function domMediaPrefixForUrl(value) { + const raw = String(value || ""); + if (isDomDownloadUrl(raw)) return domDownloadPrefix; + if (isDomAudioUrl(raw)) return domAudioPrefix; + if (isDomStickerUrl(raw)) return domStickerPrefix; + if (isDomEmojiUrl(raw)) return domEmojiPrefix; + return null; +} + +function parseDomMediaUrl(value) { + const prefix = domMediaPrefixForUrl(value); + if (!prefix) { + return null; + } + + try { + return JSON.parse(decodeURIComponent(String(value).slice(prefix.length))); + } catch { + return null; + } +} + +function attachDomMediaChatContext(value, externalChatId, chatUrl) { + const prefix = domMediaPrefixForUrl(value); + if (!prefix) { + return value; + } + + const parsed = parseDomMediaUrl(value); + if (!parsed) { + return value; + } + + const next = { + ...parsed, + externalChatId: parsed.externalChatId || externalChatId || null, + chatUrl: normalizeMaxChatUrl(parsed.chatUrl) || normalizeMaxChatUrl(chatUrl) || null + }; + return `${prefix}${encodeURIComponent(JSON.stringify(next))}`; +} + +async function ensureDomMediaChatContext(p, request) { + const externalChatId = String(request?.externalChatId || "").trim(); + const chatUrl = normalizeMaxChatUrl(request?.chatUrl); + if (!externalChatId && !chatUrl) { + return; + } + + await ensureDomChatOpen(p, externalChatId, 5000, false, chatUrl); +} + function isPrivateHost(hostname) { const host = String(hostname || "").toLowerCase(); if (!host || host === "localhost" || host.endsWith(".localhost")) return true; @@ -913,20 +964,28 @@ function isPrivateHost(hostname) { async function fetchMediaThroughMaxSession(p, mediaUrl) { if (isDomDownloadUrl(mediaUrl)) { - return await downloadDomAttachmentThroughClick(p, parseDomDownloadUrl(mediaUrl)); + const request = parseDomDownloadUrl(mediaUrl); + await ensureDomMediaChatContext(p, request); + return await downloadDomAttachmentThroughClick(p, request); } if (isDomAudioUrl(mediaUrl)) { - return await downloadDomAudioThroughPlay(p, parseDomAudioUrl(mediaUrl)); + const request = parseDomAudioUrl(mediaUrl); + await ensureDomMediaChatContext(p, request); + return await downloadDomAudioThroughPlay(p, request); } if (isDomStickerUrl(mediaUrl)) { - return await downloadDomStickerThroughScreenshot(p, parseDomStickerUrl(mediaUrl)); + const request = parseDomStickerUrl(mediaUrl); + await ensureDomMediaChatContext(p, request); + return await downloadDomStickerThroughScreenshot(p, request); } if (isDomEmojiUrl(mediaUrl)) { + const request = parseDomEmojiUrl(mediaUrl); + await ensureDomMediaChatContext(p, request); return await downloadDomStickerThroughScreenshot(p, { - ...parseDomEmojiUrl(mediaUrl), + ...request, selector: "[data-testid*='emoji' i], [class*='emoji' i], [class*='lottie' i], [class*='emoticon' i], canvas, svg", kindLabel: "MAX emoji canvas", acceptSmall: true, @@ -2906,10 +2965,14 @@ async function extractOpenChatHistory(p, requestedExternalChatId) { sentAt: orderedSentAt(message.sentAt), deliveryState: message.deliveryState || null, rect: message.rect || null, - attachments: (message.attachments || []).map((attachment, index) => ({ - ...attachment, - externalId: `dommedia:${stableHash(externalId, messageExternalId, attachment.remoteUrl || attachment.externalId || "", String(index))}` - })) + attachments: (message.attachments || []).map((attachment, index) => { + const remoteUrl = attachDomMediaChatContext(attachment.remoteUrl, externalId, raw.url); + return { + ...attachment, + remoteUrl, + externalId: `dommedia:${stableHash(externalId, messageExternalId, remoteUrl || attachment.externalId || "", String(index))}` + }; + }) }; }) };