store file promise in fileObjectUrlPromise

This commit is contained in:
Abhinav-grd 2021-08-29 14:58:53 +05:30
parent 362d4f89ae
commit 974d8d9241
2 changed files with 34 additions and 37 deletions

View file

@ -1,20 +1,13 @@
import { getToken } from 'utils/common/key'; import { getToken } from 'utils/common/key';
import { getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil'; import { getFileUrl, getThumbnailUrl } from 'utils/common/apiUtil';
import CryptoWorker from 'utils/crypto'; import CryptoWorker from 'utils/crypto';
import { import { generateStreamFromArrayBuffer, convertForPreview } from 'utils/file';
fileIsHEIC,
convertHEIC2JPEG,
fileNameWithoutExtension,
generateStreamFromArrayBuffer,
} from 'utils/file';
import HTTPService from './HTTPService'; import HTTPService from './HTTPService';
import { File, FILE_TYPE } from './fileService'; import { File, FILE_TYPE } from './fileService';
import { logError } from 'utils/sentry'; import { logError } from 'utils/sentry';
import { decodeMotionPhoto } from './motionPhotoService';
import { getMimeTypeFromBlob } from './upload/readFileService';
class DownloadManager { class DownloadManager {
private fileDownloads = new Map<string, string>(); private fileObjectUrlPromise = new Map<string, Promise<string>>();
private thumbnailObjectUrlPromise = new Map<number, Promise<string>>(); private thumbnailObjectUrlPromise = new Map<number, Promise<string>>();
public async getPreview(file: File) { public async getPreview(file: File) {
@ -75,40 +68,23 @@ class DownloadManager {
getFile = async (file: File, forPreview = false) => { getFile = async (file: File, forPreview = false) => {
try { try {
if (!this.fileDownloads.get(`${file.id}_${forPreview}`)) { const getFilePromise = (async () => {
// unzip motion photo and return fileBlob of the image for preview
const fileStream = await this.downloadFile(file); const fileStream = await this.downloadFile(file);
let fileBlob = await new Response(fileStream).blob(); let fileBlob = await new Response(fileStream).blob();
if (forPreview) { if (forPreview) {
if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) { fileBlob = await convertForPreview(file, fileBlob);
const originalName = fileNameWithoutExtension(
file.metadata.title
);
const motionPhoto = await decodeMotionPhoto(
fileBlob,
originalName
);
fileBlob = new Blob([motionPhoto.image]);
} }
return URL.createObjectURL(fileBlob);
const typeFromExtension = })();
file.metadata.title.split('.')[-1]; if (!this.fileObjectUrlPromise.get(`${file.id}_${forPreview}`)) {
const worker = await new CryptoWorker(); this.fileObjectUrlPromise.set(
const mimeType =
(await getMimeTypeFromBlob(worker, fileBlob)) ??
typeFromExtension;
if (fileIsHEIC(mimeType)) {
fileBlob = await convertHEIC2JPEG(fileBlob);
}
}
this.fileDownloads.set(
`${file.id}_${forPreview}`, `${file.id}_${forPreview}`,
URL.createObjectURL(fileBlob) getFilePromise
); );
} }
return this.fileDownloads.get(`${file.id}_${forPreview}`); return await this.fileObjectUrlPromise.get(
`${file.id}_${forPreview}`
);
} catch (e) { } catch (e) {
logError(e, 'Failed to get File'); logError(e, 'Failed to get File');
} }

View file

@ -1,5 +1,7 @@
import { Collection } from 'services/collectionService'; 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 { runningInBrowser } from 'utils/common';
import CryptoWorker from 'utils/crypto'; 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;
}