From e8aa6141dd65b096f2d6351fce7fcfbfea5b9631 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 11 Nov 2021 17:57:42 +0530 Subject: [PATCH] bubble up error to caller from queue processor --- src/services/ffmpegService.ts | 15 ++++++++++----- src/services/upload/queueProcessor.ts | 16 ++++++++++------ src/utils/common/errorUtil.ts | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/services/ffmpegService.ts b/src/services/ffmpegService.ts index 4cfcdf9be..2b4bf2970 100644 --- a/src/services/ffmpegService.ts +++ b/src/services/ffmpegService.ts @@ -33,12 +33,17 @@ class FFmpegService { const response = this.generateThumbnailProcessor.queueUpRequest( generateThumbnailHelper.bind(null, this.ffmpeg, file) ); - - const thumbnail = await response.promise; - if (!thumbnail) { - throw Error(CustomError.THUMBNAIL_GENERATION_FAILED); + try { + return await response.promise; + } catch (e) { + if (e.message === CustomError.REQUEST_CANCELLED) { + // ignore + return null; + } else { + logError(e, 'ffmpeg thumbnail generation failed'); + throw e; + } } - return thumbnail; } } diff --git a/src/services/upload/queueProcessor.ts b/src/services/upload/queueProcessor.ts index 470659f6b..6d9e86fc6 100644 --- a/src/services/upload/queueProcessor.ts +++ b/src/services/upload/queueProcessor.ts @@ -1,6 +1,9 @@ +import { CustomError } from 'utils/common/errorUtil'; + interface RequestQueueItem { request: (canceller?: RequestCanceller) => Promise; - callback: (response) => void; + successCallback: (response: any) => void; + failureCallback: (error: Error) => void; isCanceled: { status: boolean }; canceller: { exec: () => void }; } @@ -26,10 +29,11 @@ export default class QueueProcessor { }, }; - const promise = new Promise((resolve) => { + const promise = new Promise((resolve, reject) => { this.requestQueue.push({ request, - callback: resolve, + successCallback: resolve, + failureCallback: reject, isCanceled, canceller, }); @@ -53,15 +57,15 @@ export default class QueueProcessor { let response = null; if (queueItem.isCanceled.status) { - response = null; + queueItem.failureCallback(Error(CustomError.REQUEST_CANCELLED)); } else { try { response = await queueItem.request(queueItem.canceller); + queueItem.successCallback(response); } catch (e) { - response = null; + queueItem.failureCallback(e); } } - queueItem.callback(response); } } } diff --git a/src/utils/common/errorUtil.ts b/src/utils/common/errorUtil.ts index 664388966..626f7fe58 100644 --- a/src/utils/common/errorUtil.ts +++ b/src/utils/common/errorUtil.ts @@ -28,6 +28,7 @@ export enum CustomError { FAV_COLLECTION_MISSING = 'favorite collection missing', INVALID_COLLECTION_OPERATION = 'invalid collection operation', WAIT_TIME_EXCEEDED = 'thumbnail generation wait time exceeded', + REQUEST_CANCELLED = 'request canceled', } function parseUploadError(error: AxiosResponse) {