Normalize message attachments

This commit is contained in:
trevor-signal 2025-05-22 21:09:54 -04:00 committed by GitHub
commit d6e81eee11
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 2540 additions and 807 deletions

View file

@ -49,7 +49,6 @@ import type {
ItemType,
StoredItemType,
MessageType,
MessageTypeUnhydrated,
PreKeyIdType,
PreKeyType,
StoredPreKeyType,
@ -62,7 +61,6 @@ import type {
ClientOnlyReadableInterface,
ClientOnlyWritableInterface,
} from './Interface';
import { hydrateMessage } from './hydration';
import type { MessageAttributesType } from '../model-types';
import type { AttachmentDownloadJobType } from '../types/AttachmentDownload';
@ -546,7 +544,6 @@ function handleSearchMessageJSON(
messages: Array<ServerSearchResultMessageType>
): Array<ClientSearchResultMessageType> {
return messages.map<ClientSearchResultMessageType>(message => {
const parsedMessage = hydrateMessage(message);
assertDev(
message.ftsSnippet ?? typeof message.mentionStart === 'number',
'Neither ftsSnippet nor matching mention returned from message search'
@ -554,7 +551,7 @@ function handleSearchMessageJSON(
const snippet =
message.ftsSnippet ??
generateSnippetAroundMention({
body: parsedMessage.body || '',
body: message.body || '',
mentionStart: message.mentionStart ?? 0,
mentionLength: message.mentionLength ?? 1,
});
@ -562,7 +559,7 @@ function handleSearchMessageJSON(
return {
// Empty array is a default value. `message.json` has the real field
bodyRanges: [],
...parsedMessage,
...message,
snippet,
};
});
@ -629,15 +626,17 @@ async function saveMessages(
forceSave,
ourAci,
postSaveUpdates,
_testOnlyAvoidNormalizingAttachments,
}: {
forceSave?: boolean;
ourAci: AciString;
postSaveUpdates: () => Promise<void>;
_testOnlyAvoidNormalizingAttachments?: boolean;
}
): Promise<Array<string>> {
const result = await writableChannel.saveMessages(
arrayOfMessages.map(message => _cleanMessageData(message)),
{ forceSave, ourAci }
{ forceSave, ourAci, _testOnlyAvoidNormalizingAttachments }
);
drop(postSaveUpdates?.());
@ -730,19 +729,13 @@ async function removeMessages(
await writableChannel.removeMessages(messageIds);
}
function handleMessageJSON(
messages: Array<MessageTypeUnhydrated>
): Array<MessageType> {
return messages.map(message => hydrateMessage(message));
}
async function getNewerMessagesByConversation(
options: AdjacentMessagesByConversationOptionsType
): Promise<Array<MessageType>> {
const messages =
await readableChannel.getNewerMessagesByConversation(options);
return handleMessageJSON(messages);
return messages;
}
async function getRecentStoryReplies(
@ -754,7 +747,7 @@ async function getRecentStoryReplies(
options
);
return handleMessageJSON(messages);
return messages;
}
async function getOlderMessagesByConversation(
@ -763,7 +756,7 @@ async function getOlderMessagesByConversation(
const messages =
await readableChannel.getOlderMessagesByConversation(options);
return handleMessageJSON(messages);
return messages;
}
async function getConversationRangeCenteredOnMessage(
@ -772,11 +765,7 @@ async function getConversationRangeCenteredOnMessage(
const result =
await readableChannel.getConversationRangeCenteredOnMessage(options);
return {
...result,
older: handleMessageJSON(result.older),
newer: handleMessageJSON(result.newer),
};
return result;
}
async function removeMessagesInConversation(
@ -832,9 +821,13 @@ async function saveAttachmentDownloadJob(
// Other
async function cleanupOrphanedAttachments(): Promise<void> {
async function cleanupOrphanedAttachments({
_block = false,
}: {
_block?: boolean;
} = {}): Promise<void> {
try {
await invokeWithTimeout(CLEANUP_ORPHANED_ATTACHMENTS_KEY);
await invokeWithTimeout(CLEANUP_ORPHANED_ATTACHMENTS_KEY, { _block });
} catch (error) {
log.warn(
'sql/Client: cleanupOrphanedAttachments failure',
@ -859,9 +852,12 @@ async function removeOtherData(): Promise<void> {
]);
}
async function invokeWithTimeout(name: string): Promise<void> {
async function invokeWithTimeout(
name: string,
...args: Array<unknown>
): Promise<void> {
return createTaskWithTimeout(
() => ipc.invoke(name),
() => ipc.invoke(name, ...args),
`callChannel call to ${name}`
)();
}