diff --git a/lib/utils/message-ops-utils.js b/lib/utils/message-ops-utils.js --- a/lib/utils/message-ops-utils.js +++ b/lib/utils/message-ops-utils.js @@ -1,16 +1,16 @@ // @flow -import invariant from 'invariant'; import _keyBy from 'lodash/fp/keyBy.js'; import { messageID } from '../shared/message-utils.js'; import { messageSpecs } from '../shared/messages/message-specs.js'; import type { + EncryptedVideo, Media, ClientDBMediaInfo, Image, Video, -} from '../types/media-types.js'; +} from '../types/media-types'; import { type ClientDBMessageInfo, type RawMessageInfo, @@ -26,28 +26,39 @@ ): $ReadOnlyArray { const clientDBMediaInfos = []; for (const m of media) { - invariant( - m.type === 'photo' || m.type === 'video', - 'unimplemented media type', - ); + const type = + m.type === 'encrypted_photo' + ? 'photo' + : m.type === 'encrypted_video' + ? 'video' + : m.type; + + const mediaURI = + m.type === 'encrypted_photo' || m.type === 'encrypted_video' + ? m.holder + : m.uri; clientDBMediaInfos.push({ id: m.id, - uri: m.uri, - type: m.type, + uri: mediaURI, + type: type, extras: JSON.stringify({ dimensions: m.dimensions, - loop: m.type === 'video' ? m.loop : false, + loop: type === 'video' ? m.loop : false, local_media_selection: m.localMediaSelection, + encryption_key: m.encryptionKey, }), }); - if (m.type === 'video') { + if (m.type === 'video' || m.type === 'encrypted_video') { + const thumbnailURI = + m.type === 'encrypted_video' ? m.thumbnailHolder : m.thumbnailURI; clientDBMediaInfos.push({ id: m.thumbnailID, - uri: m.thumbnailURI, + uri: thumbnailURI, type: 'photo', extras: JSON.stringify({ dimensions: m.dimensions, loop: false, + encryption_key: m.thumbnailEncryptionKey, }), }); } @@ -103,18 +114,29 @@ const messageContent: $ReadOnlyArray = JSON.parse(clientDBMessageInfo.content); - const translatedMedia = []; + const translatedMedia: Media[] = []; for (const media of messageContent) { if (media.type === 'photo') { const extras = JSON.parse(mediaMap[media.uploadID].extras); - const { dimensions } = extras; + const { dimensions, encryption_key: encryptionKey } = extras; - const image: Image = { - id: media.uploadID, - uri: mediaMap[media.uploadID].uri, - type: 'photo', - dimensions, - }; + let image; + if (encryptionKey) { + image = { + id: media.uploadID, + type: 'encrypted_photo', + holder: mediaMap[media.uploadID].uri, + dimensions, + encryptionKey, + }; + } else { + image = { + id: media.uploadID, + type: 'photo', + uri: mediaMap[media.uploadID].uri, + dimensions, + }; + } translatedMedia.push(image); } else if (media.type === 'video') { const extras = JSON.parse(mediaMap[media.uploadID].extras); @@ -122,20 +144,39 @@ dimensions, loop, local_media_selection: localMediaSelection, + encryption_key: encryptionKey, } = extras; - const video: Video = { - id: media.uploadID, - uri: mediaMap[media.uploadID].uri, - type: 'video', - dimensions, - loop, - thumbnailID: media.thumbnailUploadID, - thumbnailURI: mediaMap[media.thumbnailUploadID].uri, - }; - translatedMedia.push( - localMediaSelection ? { ...video, localMediaSelection } : video, - ); + if (encryptionKey) { + const thumbnailEncryptionKey = JSON.parse( + mediaMap[media.thumbnailUploadID].extras, + ).encryption_key; + const video: EncryptedVideo = { + id: media.uploadID, + type: 'encrypted_video', + holder: mediaMap[media.uploadID].uri, + dimensions, + loop, + encryptionKey, + thumbnailID: media.thumbnailUploadID, + thumbnailHolder: mediaMap[media.thumbnailUploadID].uri, + thumbnailEncryptionKey, + }; + translatedMedia.push(video); + } else { + const video: Video = { + id: media.uploadID, + uri: mediaMap[media.uploadID].uri, + type: 'video', + dimensions, + loop, + thumbnailID: media.thumbnailUploadID, + thumbnailURI: mediaMap[media.thumbnailUploadID].uri, + }; + translatedMedia.push( + localMediaSelection ? { ...video, localMediaSelection } : video, + ); + } } } return translatedMedia; diff --git a/lib/utils/message-ops-utils.test.js b/lib/utils/message-ops-utils.test.js --- a/lib/utils/message-ops-utils.test.js +++ b/lib/utils/message-ops-utils.test.js @@ -444,3 +444,100 @@ rawMessageInfo.media, ); }); + +test('Test translateClientDBMediaInfosToMedia() with encrypted photo', () => { + const clientDBMessageInfo: ClientDBMessageInfo = { + id: 'local0', + local_id: 'local0', + thread: '90145', + user: '90134', + type: '15', + future_type: null, + time: '1665014145088', + content: '[{"type":"photo","uploadID":"localUpload0"}]', + media_infos: [ + { + id: 'localUpload0', + uri: 'assets-library://asset/asset.jpeg?id=6F1BEA56-3875-474C-B3AF-B11DEDCBAFF2&ext=jpeg', + type: 'photo', + extras: + '{"dimensions":{"height":1010,"width":576},"loop":false,"encryption_key":"someKey"}', + }, + ], + }; + const rawMessageInfo = { + type: 15, + threadID: '90145', + creatorID: '90134', + time: 1665014145088, + media: [ + { + id: 'localUpload0', + type: 'encrypted_photo', + holder: + 'assets-library://asset/asset.jpeg?id=6F1BEA56-3875-474C-B3AF-B11DEDCBAFF2&ext=jpeg', + encryptionKey: 'someKey', + dimensions: { height: 1010, width: 576 }, + }, + ], + localID: 'local0', + }; + expect(translateClientDBMediaInfosToMedia(clientDBMessageInfo)).toStrictEqual( + rawMessageInfo.media, + ); +}); + +test('Test translateClientDBMediaInfosToMedia() with encrypted video', () => { + const clientDBMessageInfo: ClientDBMessageInfo = { + id: 'local0', + local_id: 'local0', + thread: '90145', + user: '90134', + type: '15', + future_type: null, + time: '1665014145088', + content: + '[{"type":"video","uploadID":"localUpload0","thumbnailUploadID":"localUpload1"}]', + media_infos: [ + { + id: 'localUpload0', + uri: 'assets-library://asset/asset.mov?id=6F1BEA56-3875-474C-B3AF-B11DEDCBAFF2&ext=mov', + type: 'video', + extras: + '{"dimensions":{"height":1010,"width":576},"loop":false,"encryption_key":"someVideoKey"}', + }, + { + id: 'localUpload1', + uri: 'assets-library://asset/asset.jpeg?id=6F1BEA56-3875-474C-B3AF-B11DEDCBAFF2&ext=jpeg', + type: 'photo', + extras: + '{"dimensions":{"height":1010,"width":576},"loop":false,"encryption_key":"someThumbKey"}', + }, + ], + }; + const rawMessageInfo = { + type: 15, + threadID: '90145', + creatorID: '90134', + time: 1665014145088, + media: [ + { + id: 'localUpload0', + type: 'encrypted_video', + holder: + 'assets-library://asset/asset.mov?id=6F1BEA56-3875-474C-B3AF-B11DEDCBAFF2&ext=mov', + encryptionKey: 'someVideoKey', + dimensions: { height: 1010, width: 576 }, + loop: false, + thumbnailID: 'localUpload1', + thumbnailHolder: + 'assets-library://asset/asset.jpeg?id=6F1BEA56-3875-474C-B3AF-B11DEDCBAFF2&ext=jpeg', + thumbnailEncryptionKey: 'someThumbKey', + }, + ], + localID: 'local0', + }; + expect(translateClientDBMediaInfosToMedia(clientDBMessageInfo)).toStrictEqual( + rawMessageInfo.media, + ); +});