From 720b14ec42c1965138ed6abcb1b50b1824a6440a Mon Sep 17 00:00:00 2001 From: Abhinav-grd Date: Mon, 24 May 2021 11:33:14 +0530 Subject: [PATCH] added logic to terminate upload worker after upload finish --- src/services/uploadService.ts | 25 ++++++++----------------- src/utils/crypto/index.ts | 21 ++++++++++++++------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/services/uploadService.ts b/src/services/uploadService.ts index 32a0cf76c..ebda33b90 100644 --- a/src/services/uploadService.ts +++ b/src/services/uploadService.ts @@ -9,7 +9,7 @@ import { ErrorHandler, THUMBNAIL_GENERATION_FAILED, } from 'utils/common/errorUtil'; -import { getDedicatedCryptoWorker } from 'utils/crypto'; +import { ComlinkWorker, getDedicatedCryptoWorker } from 'utils/crypto'; import * as convert from 'xml-js'; import { ENCRYPTION_CHUNK_SIZE } from 'types'; import { getToken } from 'utils/common/key'; @@ -123,7 +123,7 @@ export enum UPLOAD_STAGES { } class UploadService { - private cryptoWorkers = []; + private cryptoWorkers = new Array(MAX_CONCURRENT_UPLOADS); private uploadURLs: UploadURL[] = []; private uploadURLFetchInProgress: Promise = null; private perFileProgress: number; @@ -135,20 +135,6 @@ class UploadService { private progressBarProps; private uploadErrors: Error[]; private existingFilesCollectionWise: Map; - constructor() { - const main = async () => { - try { - for (let i = 0; i < MAX_CONCURRENT_UPLOADS; i++) { - this.cryptoWorkers.push( - await new (getDedicatedCryptoWorker())() - ); - } - } catch (e) { - // ignore - } - }; - main(); - } public async uploadFiles( filesWithCollectionToUpload: FileWithCollection[], existingFiles: File[], @@ -218,9 +204,10 @@ class UploadService { i < Math.min(MAX_CONCURRENT_UPLOADS, this.totalFileCount); i++ ) { + this.cryptoWorkers[i] = getDedicatedCryptoWorker(); uploadProcesses.push( this.uploader( - this.cryptoWorkers[i], + await new this.cryptoWorkers[i].comlink(), new FileReader(), this.filesToBeUploaded.pop() ) @@ -234,6 +221,10 @@ class UploadService { this.filesToBeUploaded = []; console.error(e); throw e; + } finally { + for (let i = 0; i < MAX_CONCURRENT_UPLOADS; i++) { + this.cryptoWorkers[i]?.worker.terminate(); + } } } diff --git a/src/utils/crypto/index.ts b/src/utils/crypto/index.ts index 3575e1cd0..7f2f08863 100644 --- a/src/utils/crypto/index.ts +++ b/src/utils/crypto/index.ts @@ -7,14 +7,21 @@ import { SESSION_KEYS, setKey } from 'utils/storage/sessionStorage'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; import { getActualKey, getToken } from 'utils/common/key'; import { SetRecoveryKey } from 'services/userService'; +export interface ComlinkWorker { + comlink: any; + worker: Worker; +} -const CryptoWorker: any = - runningInBrowser() && - Comlink.wrap(new Worker('worker/crypto.worker.js', { type: 'module' })); - -export const getDedicatedCryptoWorker = (): any => - runningInBrowser() && - Comlink.wrap(new Worker('worker/crypto.worker.js', { type: 'module' })); +export const getDedicatedCryptoWorker = (): ComlinkWorker => { + if (runningInBrowser()) { + const worker = new Worker('worker/crypto.worker.js', { + type: 'module', + }); + const comlink = Comlink.wrap(worker); + return { comlink, worker }; + } +}; +const CryptoWorker: any = getDedicatedCryptoWorker()?.comlink; export async function generateKeyAttributes( passphrase: string