From 974d8d92416da928704163b13f3c50f3a0d1392a Mon Sep 17 00:00:00 2001 From: Abhinav-grd Date: Sun, 29 Aug 2021 14:58:53 +0530 Subject: [PATCH] store file promise in fileObjectUrlPromise --- src/services/downloadManager.ts | 48 +++++++++------------------------ src/utils/file/index.ts | 23 +++++++++++++++- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/src/services/downloadManager.ts b/src/services/downloadManager.ts index c4bd3c15f..af2c72e92 100644 --- a/src/services/downloadManager.ts +++ b/src/services/downloadManager.ts @@ -1,20 +1,13 @@ import { getToken } from 'utils/common/key'; import { getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil'; import CryptoWorker from 'utils/crypto'; -import { - fileIsHEIC, - convertHEIC2JPEG, - fileNameWithoutExtension, - generateStreamFromArrayBuffer, -} from 'utils/file'; +import { generateStreamFromArrayBuffer, convertForPreview } from 'utils/file'; import HTTPService from './HTTPService'; import { File, FILE_TYPE } from './fileService'; import { logError } from 'utils/sentry'; -import { decodeMotionPhoto } from './motionPhotoService'; -import { getMimeTypeFromBlob } from './upload/readFileService'; class DownloadManager { - private fileDownloads = new Map(); + private fileObjectUrlPromise = new Map>(); private thumbnailObjectUrlPromise = new Map>(); public async getPreview(file: File) { @@ -75,40 +68,23 @@ class DownloadManager { getFile = async (file: File, forPreview = false) => { try { - if (!this.fileDownloads.get(`${file.id}_${forPreview}`)) { - // unzip motion photo and return fileBlob of the image for preview + const getFilePromise = (async () => { const fileStream = await this.downloadFile(file); let fileBlob = await new Response(fileStream).blob(); if (forPreview) { - if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) { - const originalName = fileNameWithoutExtension( - file.metadata.title - ); - const motionPhoto = await decodeMotionPhoto( - fileBlob, - originalName - ); - fileBlob = new Blob([motionPhoto.image]); - } - - const typeFromExtension = - file.metadata.title.split('.')[-1]; - const worker = await new CryptoWorker(); - - const mimeType = - (await getMimeTypeFromBlob(worker, fileBlob)) ?? - typeFromExtension; - - if (fileIsHEIC(mimeType)) { - fileBlob = await convertHEIC2JPEG(fileBlob); - } + fileBlob = await convertForPreview(file, fileBlob); } - this.fileDownloads.set( + return URL.createObjectURL(fileBlob); + })(); + if (!this.fileObjectUrlPromise.get(`${file.id}_${forPreview}`)) { + this.fileObjectUrlPromise.set( `${file.id}_${forPreview}`, - URL.createObjectURL(fileBlob) + getFilePromise ); } - return this.fileDownloads.get(`${file.id}_${forPreview}`); + return await this.fileObjectUrlPromise.get( + `${file.id}_${forPreview}` + ); } catch (e) { logError(e, 'Failed to get File'); } diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 0ba886f78..ccdbcac5e 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -1,5 +1,7 @@ import { Collection } from 'services/collectionService'; -import { File } from 'services/fileService'; +import { File, FILE_TYPE } from 'services/fileService'; +import { decodeMotionPhoto } from 'services/motionPhotoService'; +import { getMimeTypeFromBlob } from 'services/upload/readFileService'; import { runningInBrowser } from 'utils/common'; import CryptoWorker from 'utils/crypto'; @@ -175,3 +177,22 @@ export function generateStreamFromArrayBuffer(data: Uint8Array) { }, }); } + +export async function convertForPreview(file: File, fileBlob: Blob) { + if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) { + const originalName = fileNameWithoutExtension(file.metadata.title); + const motionPhoto = await decodeMotionPhoto(fileBlob, originalName); + fileBlob = new Blob([motionPhoto.image]); + } + + const typeFromExtension = file.metadata.title.split('.')[-1]; + const worker = await new CryptoWorker(); + + const mimeType = + (await getMimeTypeFromBlob(worker, fileBlob)) ?? typeFromExtension; + + if (fileIsHEIC(mimeType)) { + fileBlob = await convertHEIC2JPEG(fileBlob); + } + return fileBlob; +}