diff --git a/lib/shared/dm-ops/send-multimedia-message-spec.js b/lib/shared/dm-ops/send-multimedia-message-spec.js index 0bdae1ce2..1347d23c9 100644 --- a/lib/shared/dm-ops/send-multimedia-message-spec.js +++ b/lib/shared/dm-ops/send-multimedia-message-spec.js @@ -1,69 +1,106 @@ // @flow import type { DMOperationSpec, ProcessDMOperationUtilities, } from './dm-op-spec.js'; -import type { DMSendMultimediaMessageOperation } from '../../types/dm-ops.js'; +import { + encryptedMediaBlobURI, + encryptedVideoThumbnailBlobURI, +} from '../../media/media-utils.js'; +import type { + DMSendMultimediaMessageOperation, + DMBlobOperation, +} from '../../types/dm-ops.js'; import { messageTypes } from '../../types/message-types-enum.js'; import type { ClientUpdateInfo } from '../../types/update-types.js'; +import { blobHashFromBlobServiceURI } from '../../utils/blob-service.js'; import { rawMessageInfoFromMessageData } from '../message-utils.js'; function createMessageDataWithInfoFromDMOperation( dmOperation: DMSendMultimediaMessageOperation, ) { const { threadID, creatorID, time, media, messageID } = dmOperation; const messageData = { type: messageTypes.MULTIMEDIA, threadID, creatorID, time, media, }; const rawMessageInfo = rawMessageInfoFromMessageData(messageData, messageID); return { messageData, rawMessageInfo }; } +function getBlobOpsFromOperation( + dmOperation: DMSendMultimediaMessageOperation, +): Array { + const ops: Array = []; + + for (const media of dmOperation.media) { + if (media.type !== 'encrypted_photo' && media.type !== 'encrypted_video') { + continue; + } + const blobURI = encryptedMediaBlobURI(media); + ops.push({ + type: 'establish_holder', + blobHash: blobHashFromBlobServiceURI(blobURI), + dmOpType: 'inbound_only', + }); + if (media.type === 'encrypted_video') { + const thumbnailBlobURI = encryptedVideoThumbnailBlobURI(media); + ops.push({ + type: 'establish_holder', + blobHash: blobHashFromBlobServiceURI(thumbnailBlobURI), + dmOpType: 'inbound_only', + }); + } + } + + return ops; +} + const sendMultimediaMessageSpec: DMOperationSpec = Object.freeze({ notificationsCreationData: async ( dmOperation: DMSendMultimediaMessageOperation, ) => { return { messageDatasWithMessageInfos: [ createMessageDataWithInfoFromDMOperation(dmOperation), ], }; }, processDMOperation: async ( dmOperation: DMSendMultimediaMessageOperation, ) => { const { rawMessageInfo } = createMessageDataWithInfoFromDMOperation(dmOperation); const rawMessageInfos = [rawMessageInfo]; const updateInfos: Array = []; + const blobOps = getBlobOpsFromOperation(dmOperation); return { rawMessageInfos, updateInfos, - blobOps: [], + blobOps, }; }, canBeProcessed: async ( dmOperation: DMSendMultimediaMessageOperation, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { return { isProcessingPossible: true }; } return { isProcessingPossible: false, reason: { type: 'missing_thread', threadID: dmOperation.threadID, }, }; }, supportsAutoRetry: false, }); export { sendMultimediaMessageSpec };