diff --git a/src/services/ffmpeg/ffmpegClient.ts b/src/services/ffmpeg/ffmpegClient.ts index 7423fe940..7aa7a29b0 100644 --- a/src/services/ffmpeg/ffmpegClient.ts +++ b/src/services/ffmpeg/ffmpegClient.ts @@ -4,7 +4,6 @@ import { parseFFmpegExtractedMetadata } from 'utils/ffmpeg'; class FFmpegClient { private ffmpeg: FFmpeg; - private fileReader: FileReader; private ready: Promise = null; constructor() { this.ffmpeg = createFFmpeg({ @@ -19,9 +18,6 @@ class FFmpegClient { if (!this.ffmpeg.isLoaded()) { await this.ffmpeg.load(); } - if (!this.fileReader) { - this.fileReader = new FileReader(); - } } async generateThumbnail(file: File) { @@ -31,7 +27,7 @@ class FFmpegClient { this.ffmpeg.FS( 'writeFile', inputFileName, - await getUint8ArrayView(this.fileReader, file) + await getUint8ArrayView(file) ); let seekTime = 1.0; let thumb = null; @@ -66,7 +62,7 @@ class FFmpegClient { this.ffmpeg.FS( 'writeFile', inputFileName, - await getUint8ArrayView(this.fileReader, file) + await getUint8ArrayView(file) ); let metadata = null; diff --git a/src/services/migrateThumbnailService.ts b/src/services/migrateThumbnailService.ts index f011d86bd..421b76b24 100644 --- a/src/services/migrateThumbnailService.ts +++ b/src/services/migrateThumbnailService.ts @@ -44,7 +44,6 @@ export async function replaceThumbnail( try { const token = getToken(); const worker = await new CryptoWorker(); - const reader = new FileReader(); const files = await getLocalFiles(); const trash = await getLocalTrash(); const trashFiles = getTrashedFiles(trash); @@ -77,9 +76,8 @@ export async function replaceThumbnail( [originalThumbnail], file.metadata.title ); - const fileTypeInfo = await getFileType(reader, dummyImageFile); + const fileTypeInfo = await getFileType(dummyImageFile); const { thumbnail: newThumbnail } = await generateThumbnail( - reader, dummyImageFile, fileTypeInfo ); diff --git a/src/services/readerService.ts b/src/services/readerService.ts index 59a2a2a98..1c2039abc 100644 --- a/src/services/readerService.ts +++ b/src/services/readerService.ts @@ -1,44 +1,11 @@ import { ElectronFile } from 'types/upload'; -export async function getUint8ArrayView( - reader: FileReader, - file: Blob -): Promise { - return await new Promise((resolve, reject) => { - reader.onabort = () => - reject( - Error( - `file reading was aborted, file size= ${convertBytesToHumanReadable( - file.size - )}` - ) - ); - reader.onerror = () => - reject( - Error( - `file reading has failed, file size= ${convertBytesToHumanReadable( - file.size - )} , reason= ${reader.error}` - ) - ); - reader.onload = () => { - // Do whatever you want with the file contents - const result = - typeof reader.result === 'string' - ? new TextEncoder().encode(reader.result) - : new Uint8Array(reader.result); - resolve(result); - }; - reader.readAsArrayBuffer(file); - }); +export async function getUint8ArrayView(file: Blob): Promise { + return new Uint8Array(await file.arrayBuffer()); } -export function getFileStream( - reader: FileReader, - file: File, - chunkSize: number -) { - const fileChunkReader = fileChunkReaderMaker(reader, file, chunkSize); +export function getFileStream(file: File, chunkSize: number) { + const fileChunkReader = fileChunkReaderMaker(file, chunkSize); const stream = new ReadableStream({ async pull(controller: ReadableStreamDefaultController) { @@ -68,15 +35,11 @@ export async function getElectronFileStream( }; } -async function* fileChunkReaderMaker( - reader: FileReader, - file: File, - chunkSize: number -) { +async function* fileChunkReaderMaker(file: File, chunkSize: number) { let offset = 0; while (offset < file.size) { const blob = file.slice(offset, chunkSize + offset); - const fileChunk = await getUint8ArrayView(reader, blob); + const fileChunk = await getUint8ArrayView(blob); yield fileChunk; offset += chunkSize; } diff --git a/src/services/typeDetectionService.ts b/src/services/typeDetectionService.ts index 2f7e6fda6..e9601c50c 100644 --- a/src/services/typeDetectionService.ts +++ b/src/services/typeDetectionService.ts @@ -12,7 +12,6 @@ const TYPE_IMAGE = 'image'; const CHUNK_SIZE_FOR_TYPE_DETECTION = 4100; export async function getFileType( - reader: FileReader, receivedFile: File | ElectronFile ): Promise { try { @@ -20,7 +19,7 @@ export async function getFileType( let typeResult: FileTypeResult; if (receivedFile instanceof File) { - typeResult = await extractFileType(reader, receivedFile); + typeResult = await extractFileType(receivedFile); } else { typeResult = await extractElectronFileType(receivedFile); } @@ -64,9 +63,9 @@ export async function getFileType( } } -async function extractFileType(reader: FileReader, file: File) { +async function extractFileType(file: File) { const fileChunkBlob = file.slice(0, CHUNK_SIZE_FOR_TYPE_DETECTION); - return getFileTypeFromBlob(reader, fileChunkBlob); + return getFileTypeFromBlob(fileChunkBlob); } async function extractElectronFileType(file: ElectronFile) { @@ -77,9 +76,9 @@ async function extractElectronFileType(file: ElectronFile) { return fileTypeResult; } -async function getFileTypeFromBlob(reader: FileReader, fileBlob: Blob) { +async function getFileTypeFromBlob(fileBlob: Blob) { try { - const initialFiledata = await getUint8ArrayView(reader, fileBlob); + const initialFiledata = await getUint8ArrayView(fileBlob); return await FileType.fromBuffer(initialFiledata); } catch (e) { throw Error(CustomError.TYPE_DETECTION_FAILED); diff --git a/src/services/updateCreationTimeWithExif.ts b/src/services/updateCreationTimeWithExif.ts index 2fa78d141..1a45e3377 100644 --- a/src/services/updateCreationTimeWithExif.ts +++ b/src/services/updateCreationTimeWithExif.ts @@ -38,8 +38,7 @@ export async function updateCreationTimeWithExif( } else { const fileURL = await downloadManager.getFile(file)[0]; const fileObject = await getFileFromURL(fileURL); - const reader = new FileReader(); - const fileTypeInfo = await getFileType(reader, fileObject); + const fileTypeInfo = await getFileType(fileObject); const exifData = await getRawExif(fileObject, fileTypeInfo); if (fixOption === FIX_OPTIONS.DATE_TIME_ORIGINAL) { correctCreationTime = getUnixTimeInMicroSeconds( diff --git a/src/services/upload/fileService.ts b/src/services/upload/fileService.ts index de74bb675..84315361c 100644 --- a/src/services/upload/fileService.ts +++ b/src/services/upload/fileService.ts @@ -34,12 +34,10 @@ export function getFilename(file: File | ElectronFile) { } export async function readFile( - reader: FileReader, fileTypeInfo: FileTypeInfo, rawFile: File | ElectronFile ): Promise { const { thumbnail, hasStaticThumbnail } = await generateThumbnail( - reader, rawFile, fileTypeInfo ); @@ -55,9 +53,9 @@ export async function readFile( filedata = await rawFile.arrayBuffer(); } } else if (rawFile.size > MULTIPART_PART_SIZE) { - filedata = getFileStream(reader, rawFile, FILE_READER_CHUNK_SIZE); + filedata = getFileStream(rawFile, FILE_READER_CHUNK_SIZE); } else { - filedata = await getUint8ArrayView(reader, rawFile); + filedata = await getUint8ArrayView(rawFile); } logUploadInfo(`read file data successfully ${getFileNameSize(rawFile)} `); @@ -73,8 +71,7 @@ export async function extractFileMetadata( parsedMetadataJSONMap: ParsedMetadataJSONMap, rawFile: File | ElectronFile, collectionID: number, - fileTypeInfo: FileTypeInfo, - reader: FileReader + fileTypeInfo: FileTypeInfo ) { const originalName = getFileOriginalName(rawFile); const googleMetadata = @@ -83,8 +80,7 @@ export async function extractFileMetadata( ) ?? {}; const extractedMetadata: Metadata = await extractMetadata( rawFile, - fileTypeInfo, - reader + fileTypeInfo ); for (const [key, value] of Object.entries(googleMetadata)) { diff --git a/src/services/upload/livePhotoService.ts b/src/services/upload/livePhotoService.ts index ae3c74e21..cfbe7a646 100644 --- a/src/services/upload/livePhotoService.ts +++ b/src/services/upload/livePhotoService.ts @@ -72,12 +72,10 @@ export function getLivePhotoName(imageTitle: string) { } export async function readLivePhoto( - reader: FileReader, fileTypeInfo: FileTypeInfo, livePhotoAssets: LivePhotoAssets ) { const { thumbnail, hasStaticThumbnail } = await generateThumbnail( - reader, livePhotoAssets.image, { exactType: fileTypeInfo.imageType, @@ -87,12 +85,12 @@ export async function readLivePhoto( const image = livePhotoAssets.image instanceof File - ? await getUint8ArrayView(reader, livePhotoAssets.image) + ? await getUint8ArrayView(livePhotoAssets.image) : await livePhotoAssets.image.arrayBuffer(); const video = livePhotoAssets.video instanceof File - ? await getUint8ArrayView(reader, livePhotoAssets.video) + ? await getUint8ArrayView(livePhotoAssets.video) : await livePhotoAssets.video.arrayBuffer(); return { diff --git a/src/services/upload/metadataService.ts b/src/services/upload/metadataService.ts index a2770b6f5..35583b838 100644 --- a/src/services/upload/metadataService.ts +++ b/src/services/upload/metadataService.ts @@ -33,8 +33,7 @@ const NULL_PARSED_METADATA_JSON: ParsedMetadataJSON = { export async function extractMetadata( receivedFile: File | ElectronFile, - fileTypeInfo: FileTypeInfo, - reader: FileReader + fileTypeInfo: FileTypeInfo ) { let extractedMetadata: ParsedExtractedMetadata = NULL_EXTRACTED_METADATA; if (fileTypeInfo.fileType === FILE_TYPE.IMAGE) { @@ -51,7 +50,7 @@ export async function extractMetadata( ); } - const fileHash = await getFileHash(receivedFile, reader); + const fileHash = await getFileHash(receivedFile); const metadata: Metadata = { title: receivedFile.name, diff --git a/src/services/upload/thumbnailService.ts b/src/services/upload/thumbnailService.ts index 580f7bd08..26c16f204 100644 --- a/src/services/upload/thumbnailService.ts +++ b/src/services/upload/thumbnailService.ts @@ -24,7 +24,6 @@ interface Dimension { } export async function generateThumbnail( - reader: FileReader, file: File | ElectronFile, fileTypeInfo: FileTypeInfo ): Promise<{ thumbnail: Uint8Array; hasStaticThumbnail: boolean }> { @@ -72,7 +71,7 @@ export async function generateThumbnail( } } const thumbnailBlob = await thumbnailCanvasToBlob(canvas); - thumbnail = await getUint8ArrayView(reader, thumbnailBlob); + thumbnail = await getUint8ArrayView(thumbnailBlob); if (thumbnail.length === 0) { throw Error('EMPTY THUMBNAIL'); } diff --git a/src/services/upload/uploadManager.ts b/src/services/upload/uploadManager.ts index 3d5039fc8..5a998b24f 100644 --- a/src/services/upload/uploadManager.ts +++ b/src/services/upload/uploadManager.ts @@ -201,7 +201,6 @@ class UploadManager { try { logUploadInfo(`extractMetadataFromFiles executed`); UIService.reset(mediaFiles.length); - const reader = new FileReader(); for (const { file, localID, collectionID } of mediaFiles) { try { const { fileTypeInfo, metadata } = await (async () => { @@ -215,7 +214,6 @@ class UploadManager { return { fileTypeInfo: null, metadata: null }; } const fileTypeInfo = await UploadService.getFileType( - reader, file ); if (fileTypeInfo.fileType === FILE_TYPE.OTHERS) { @@ -233,8 +231,7 @@ class UploadManager { (await UploadService.extractFileMetadata( file, collectionID, - fileTypeInfo, - reader + fileTypeInfo )) || null; return { fileTypeInfo, metadata }; })(); @@ -291,15 +288,14 @@ class UploadManager { this.cryptoWorkers[i] = cryptoWorker; uploadProcesses.push( this.uploadNextFileInQueue( - await new this.cryptoWorkers[i].comlink(), - new FileReader() + await new this.cryptoWorkers[i].comlink() ) ); } await Promise.all(uploadProcesses); } - private async uploadNextFileInQueue(worker: any, reader: FileReader) { + private async uploadNextFileInQueue(worker: any) { while (this.filesToBeUploaded.length > 0) { let fileWithCollection = this.filesToBeUploaded.pop(); const { collectionID } = fileWithCollection; @@ -310,7 +306,6 @@ class UploadManager { const { fileUploadResult, uploadedFile, skipDecryption } = await uploader( worker, - reader, existingFilesInCollection, this.existingFiles, fileWithCollection diff --git a/src/services/upload/uploadService.ts b/src/services/upload/uploadService.ts index 5085fd208..c27b8b0fc 100644 --- a/src/services/upload/uploadService.ts +++ b/src/services/upload/uploadService.ts @@ -76,32 +76,29 @@ class UploadService { : getFilename(file); } - async getFileType(reader: FileReader, file: File | ElectronFile) { - return getFileType(reader, file); + async getFileType(file: File | ElectronFile) { + return getFileType(file); } async readAsset( - reader: FileReader, fileTypeInfo: FileTypeInfo, { isLivePhoto, file, livePhotoAssets }: UploadAsset ) { return isLivePhoto - ? await readLivePhoto(reader, fileTypeInfo, livePhotoAssets) - : await readFile(reader, fileTypeInfo, file); + ? await readLivePhoto(fileTypeInfo, livePhotoAssets) + : await readFile(fileTypeInfo, file); } async extractFileMetadata( file: File | ElectronFile, collectionID: number, - fileTypeInfo: FileTypeInfo, - reader: FileReader + fileTypeInfo: FileTypeInfo ): Promise { return extractFileMetadata( this.parsedMetadataJSONMap, file, collectionID, - fileTypeInfo, - reader + fileTypeInfo ); } diff --git a/src/services/upload/uploader.ts b/src/services/upload/uploader.ts index 94e709b65..72b32fb3e 100644 --- a/src/services/upload/uploader.ts +++ b/src/services/upload/uploader.ts @@ -24,7 +24,6 @@ interface UploadResponse { } export default async function uploader( worker: any, - reader: FileReader, existingFilesInCollection: EnteFile[], existingFiles: EnteFile[], fileWithCollection: FileWithCollection @@ -87,11 +86,7 @@ export default async function uploader( } logUploadInfo(`reading asset ${fileNameSize}`); - const file = await UploadService.readAsset( - reader, - fileTypeInfo, - uploadAsset - ); + const file = await UploadService.readAsset(fileTypeInfo, uploadAsset); if (file.hasStaticThumbnail) { metadata.hasStaticThumbnail = true; diff --git a/src/utils/crypto/index.ts b/src/utils/crypto/index.ts index 3c12f27e3..28b835114 100644 --- a/src/utils/crypto/index.ts +++ b/src/utils/crypto/index.ts @@ -201,13 +201,10 @@ export async function encryptWithRecoveryKey(key: string) { } export default CryptoWorker; -export async function getFileHash( - file: File | ElectronFile, - reader: FileReader -) { +export async function getFileHash(file: File | ElectronFile) { let filedata: DataStream; if (file instanceof File) { - filedata = getFileStream(reader, file, FILE_READER_CHUNK_SIZE); + filedata = getFileStream(file, FILE_READER_CHUNK_SIZE); } else { filedata = await getElectronFileStream(file, FILE_READER_CHUNK_SIZE); } diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index d49053040..e87d0d0bc 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -77,7 +77,6 @@ export async function downloadFile( } const fileType = await getFileType( - fileReader, new File([fileBlob], file.metadata.title) ); if ( @@ -98,12 +97,12 @@ export async function downloadFile( const originalName = fileNameWithoutExtension(file.metadata.title); const motionPhoto = await decodeMotionPhoto(fileBlob, originalName); const image = new File([motionPhoto.image], motionPhoto.imageNameTitle); - const imageType = await getFileType(fileReader, image); + const imageType = await getFileType(image); tempImageURL = URL.createObjectURL( new Blob([motionPhoto.image], { type: imageType.mimeType }) ); const video = new File([motionPhoto.video], motionPhoto.videoNameTitle); - const videoType = await getFileType(fileReader, video); + const videoType = await getFileType(video); tempVideoURL = URL.createObjectURL( new Blob([motionPhoto.video], { type: videoType.mimeType }) ); @@ -338,9 +337,8 @@ export async function convertForPreview( fileBlob: Blob ): Promise { const convertIfHEIC = async (fileName: string, fileBlob: Blob) => { - const reader = new FileReader(); const mimeType = ( - await getFileType(reader, new File([fileBlob], file.metadata.title)) + await getFileType(new File([fileBlob], file.metadata.title)) ).exactType; if (isFileHEIC(mimeType)) { fileBlob = await HEICConverter.convert(fileBlob);