From e65ff3635d5b4cb91d6bc157aaed4e4f490922ba Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 21 Feb 2023 19:58:30 +0530 Subject: [PATCH] add missing await and improve error handling --- src/components/ExportModal.tsx | 49 ++++++++++--------- src/services/exportService.ts | 89 +++++++++++++++++++--------------- 2 files changed, 77 insertions(+), 61 deletions(-) diff --git a/src/components/ExportModal.tsx b/src/components/ExportModal.tsx index 1a14c14e8..44d0a2a7a 100644 --- a/src/components/ExportModal.tsx +++ b/src/components/ExportModal.tsx @@ -104,7 +104,7 @@ export default function ExportModal(props: Props) { failed: exportInfo?.failedFiles?.length ?? 0, }); if (exportInfo?.stage === ExportStage.INPROGRESS) { - resumeExport(); + await resumeExport(); } } catch (e) { logError( @@ -113,7 +113,7 @@ export default function ExportModal(props: Props) { ); } }; - main(); + void main(); }, [exportFolder]); useEffect(() => { @@ -133,7 +133,7 @@ export default function ExportModal(props: Props) { const failedFilesCnt = exportRecord.failedFiles?.length; const syncedFilesCnt = userPersonalFiles.length; if (syncedFilesCnt > exportedFileCnt + failedFilesCnt) { - updateExportProgress({ + await updateExportProgress({ current: exportedFileCnt + failedFilesCnt, total: syncedFilesCnt, }); @@ -147,11 +147,11 @@ export default function ExportModal(props: Props) { getExportRecordFileUID(file) ) ); - exportService.addFilesQueuedRecord( + await exportService.addFilesQueuedRecord( exportFolder, unExportedFiles ); - updateExportStage(ExportStage.PAUSED); + await updateExportStage(ExportStage.PAUSED); } } catch (e) { setExportStage(ExportStage.INIT); @@ -159,7 +159,7 @@ export default function ExportModal(props: Props) { } } }; - main(); + void main(); }, [props.show]); useEffect(() => { @@ -174,19 +174,21 @@ export default function ExportModal(props: Props) { setData(LS_KEYS.EXPORT, { folder: newFolder }); }; - const updateExportStage = (newStage: ExportStage) => { + const updateExportStage = async (newStage: ExportStage) => { setExportStage(newStage); - exportService.updateExportRecord({ stage: newStage }); + await exportService.updateExportRecord({ stage: newStage }); }; - const updateExportTime = (newTime: number) => { + const updateExportTime = async (newTime: number) => { setLastExportTime(newTime); - exportService.updateExportRecord({ lastAttemptTimestamp: newTime }); + await exportService.updateExportRecord({ + lastAttemptTimestamp: newTime, + }); }; - const updateExportProgress = (newProgress: ExportProgress) => { + const updateExportProgress = async (newProgress: ExportProgress) => { setExportProgress(newProgress); - exportService.updateExportRecord({ progress: newProgress }); + await exportService.updateExportRecord({ progress: newProgress }); }; // ====================== @@ -198,16 +200,16 @@ export default function ExportModal(props: Props) { if (!exportFolder) { await selectExportDirectory(); } - updateExportStage(ExportStage.INPROGRESS); + await updateExportStage(ExportStage.INPROGRESS); await sleep(100); }; const postExportRun = async (exportResult?: { paused?: boolean }) => { if (!exportResult?.paused) { - updateExportStage(ExportStage.FINISHED); + await updateExportStage(ExportStage.FINISHED); await sleep(100); - updateExportTime(Date.now()); - syncExportStatsWithRecord(); + await updateExportTime(Date.now()); + await syncExportStatsWithRecord(); } }; @@ -236,7 +238,7 @@ export default function ExportModal(props: Props) { const startExport = async () => { try { await preExportRun(); - updateExportProgress({ current: 0, total: 0 }); + await updateExportProgress({ current: 0, total: 0 }); const exportResult = await exportService.exportFiles( ExportType.NEW ); @@ -251,7 +253,7 @@ export default function ExportModal(props: Props) { const stopExport = async () => { try { exportService.stopRunningExport(); - postExportRun(); + await postExportRun(); } catch (e) { if (e.message !== CustomError.REQUEST_CANCELLED) { logError(e, 'stopExport failed'); @@ -259,11 +261,11 @@ export default function ExportModal(props: Props) { } }; - const pauseExport = () => { + const pauseExport = async () => { try { - updateExportStage(ExportStage.PAUSED); + await updateExportStage(ExportStage.PAUSED); exportService.pauseRunningExport(); - postExportRun({ paused: true }); + await postExportRun({ paused: true }); } catch (e) { if (e.message !== CustomError.REQUEST_CANCELLED) { logError(e, 'pauseExport failed'); @@ -300,7 +302,10 @@ export default function ExportModal(props: Props) { const retryFailedExport = async () => { try { await preExportRun(); - updateExportProgress({ current: 0, total: exportStats.failed }); + await updateExportProgress({ + current: 0, + total: exportStats.failed, + }); const exportResult = await exportService.exportFiles( ExportType.RETRY_FAILED diff --git a/src/services/exportService.ts b/src/services/exportService.ts index fc6d07c21..26eeb25be 100644 --- a/src/services/exportService.ts +++ b/src/services/exportService.ts @@ -208,7 +208,7 @@ class ExportService { } this.stopExport = false; this.pauseExport = false; - this.addFilesQueuedRecord(exportDir, files); + await this.addFilesQueuedRecord(exportDir, files); const failedFileCount = 0; this.electronAPIs.showOnTray({ @@ -241,16 +241,12 @@ class ExportService { RecordType.SUCCESS ); } catch (e) { + logError(e, 'failed to export file'); await this.addFileExportedRecord( exportDir, file, RecordType.FAILED ); - - logError( - e, - 'download and save failed for file during export' - ); } this.electronAPIs.showOnTray({ export_progress: `${index + 1} / ${ @@ -345,6 +341,7 @@ class ExportService { ); await response.promise; } + async updateExportRecordHelper(folder: string, newData: ExportRecord) { try { if (!folder) { @@ -358,6 +355,7 @@ class ExportService { ); } catch (e) { logError(e, 'error updating Export Record'); + throw e; } } @@ -376,6 +374,7 @@ class ExportService { } } catch (e) { logError(e, 'export Record JSON parsing failed '); + throw e; } } @@ -432,36 +431,45 @@ class ExportService { } async downloadAndSave(file: EnteFile, collectionPath: string) { - file.metadata = mergeMetadata([file])[0].metadata; - const fileSaveName = getUniqueFileSaveName( - collectionPath, - file.metadata.title, - file.id - ); - let fileStream = await retryAsyncFunction(() => - downloadManager.downloadFile(file) - ); - const fileType = getFileExtension(file.metadata.title); - if ( - file.pubMagicMetadata?.data.editedTime && - (fileType === TYPE_JPEG || fileType === TYPE_JPG) - ) { - const fileBlob = await new Response(fileStream).blob(); - if (!this.fileReader) { - this.fileReader = new FileReader(); - } - const updatedFileBlob = await updateFileCreationDateInEXIF( - this.fileReader, - fileBlob, - new Date(file.pubMagicMetadata.data.editedTime / 1000) + try { + file.metadata = mergeMetadata([file])[0].metadata; + const fileSaveName = getUniqueFileSaveName( + collectionPath, + file.metadata.title, + file.id ); - fileStream = updatedFileBlob.stream(); - } - if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) { - await this.exportMotionPhoto(fileStream, file, collectionPath); - } else { - this.saveMediaFile(collectionPath, fileSaveName, fileStream); - await this.saveMetadataFile(collectionPath, fileSaveName, file); + let fileStream = await retryAsyncFunction(() => + downloadManager.downloadFile(file) + ); + const fileType = getFileExtension(file.metadata.title); + if ( + file.pubMagicMetadata?.data.editedTime && + (fileType === TYPE_JPEG || fileType === TYPE_JPG) + ) { + const fileBlob = await new Response(fileStream).blob(); + if (!this.fileReader) { + this.fileReader = new FileReader(); + } + const updatedFileBlob = await updateFileCreationDateInEXIF( + this.fileReader, + fileBlob, + new Date(file.pubMagicMetadata.data.editedTime / 1000) + ); + fileStream = updatedFileBlob.stream(); + } + if (file.metadata.fileType === FILE_TYPE.LIVE_PHOTO) { + await this.exportMotionPhoto(fileStream, file, collectionPath); + } else { + await this.saveMediaFile( + collectionPath, + fileSaveName, + fileStream + ); + await this.saveMetadataFile(collectionPath, fileSaveName, file); + } + } catch (e) { + logError(e, 'download and save failed for file during export'); + throw e; } } @@ -478,7 +486,7 @@ class ExportService { motionPhoto.imageNameTitle, file.id ); - this.saveMediaFile(collectionPath, imageSaveName, imageStream); + await this.saveMediaFile(collectionPath, imageSaveName, imageStream); await this.saveMetadataFile(collectionPath, imageSaveName, file); const videoStream = generateStreamFromArrayBuffer(motionPhoto.video); @@ -549,9 +557,12 @@ class ExportService { collectionIDPathMap ); - await this.updateExportRecord({ - version: LATEST_EXPORT_VERSION, - }); + await this.updateExportRecord( + { + version: LATEST_EXPORT_VERSION, + }, + exportDir + ); } }