// Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { DeleteAttributesType } from '../messageModifiers/Deletes'; import type { MessageModel } from '../models/messages'; import * as log from '../logging/log'; import { isMe } from './whatTypeOfConversation'; import { getContactId } from '../messages/helpers'; import { isStory } from '../state/selectors/message'; import { isTooOldToModifyMessage } from './isTooOldToModifyMessage'; export async function deleteForEveryone( message: MessageModel, doe: Pick< DeleteAttributesType, 'fromId' | 'targetSentTimestamp' | 'serverTimestamp' >, shouldPersist = true ): Promise { if (isDeletionByMe(message, doe)) { const conversation = message.getConversation(); // Our 1:1 stories are deleted through ts/util/onStoryRecipientUpdate.ts if ( isStory(message.attributes) && conversation && isMe(conversation.attributes) ) { return; } await message.handleDeleteForEveryone(doe, shouldPersist); return; } if (isTooOldToModifyMessage(doe.serverTimestamp, message.attributes)) { log.warn('Received late DOE. Dropping.', { fromId: doe.fromId, targetSentTimestamp: doe.targetSentTimestamp, messageServerTimestamp: message.get('serverTimestamp'), messageSentAt: message.get('sent_at'), deleteServerTimestamp: doe.serverTimestamp, }); return; } await message.handleDeleteForEveryone(doe, shouldPersist); } function isDeletionByMe( message: Readonly, doe: Pick ): boolean { const ourConversationId = window.ConversationController.getOurConversationIdOrThrow(); return ( getContactId(message.attributes) === ourConversationId && doe.fromId === ourConversationId ); }