diff --git a/src/services/HEICConverter.ts b/src/services/HEICConverter.ts index 0b8ba9001..c57a80832 100644 --- a/src/services/HEICConverter.ts +++ b/src/services/HEICConverter.ts @@ -1,13 +1,18 @@ import QueueProcessor from 'services/queueProcessor'; +import { ConvertWorker } from 'utils/comlink'; import { CustomError } from 'utils/error'; import { logError } from 'utils/sentry'; class HEICConverter { - private convertProcessor = new QueueProcessor(5); + private convertProcessor = new QueueProcessor(2); + private worker = null; - async convert(worker, fileBlob: Blob, format = 'JPEG'): Promise { + async convert(fileBlob: Blob, format = 'JPEG'): Promise { + if (!this.worker) { + this.worker = await new ConvertWorker(); + } const response = this.convertProcessor.queueUpRequest( - async () => await worker.convertHEIC(format, fileBlob) + async () => await this.worker.convertHEIC(fileBlob, format) ); try { return await response.promise; diff --git a/src/services/upload/thumbnailService.ts b/src/services/upload/thumbnailService.ts index 682a06252..332570a97 100644 --- a/src/services/upload/thumbnailService.ts +++ b/src/services/upload/thumbnailService.ts @@ -85,11 +85,7 @@ export async function generateImageThumbnail( let timeout = null; if (isHEIC) { - file = new File( - [await HEICConverter.convert(worker, file)], - null, - null - ); + file = new File([await HEICConverter.convert(file)], null, null); } let image = new Image(); imageURL = URL.createObjectURL(file); diff --git a/src/utils/comlink/index.ts b/src/utils/comlink/index.ts new file mode 100644 index 000000000..4c88c66be --- /dev/null +++ b/src/utils/comlink/index.ts @@ -0,0 +1,19 @@ +import * as Comlink from 'comlink'; +import { runningInBrowser } from 'utils/common'; + +export interface ComlinkWorker { + comlink: any; + worker: Worker; +} + +export const getDedicatedConvertWorker = (): ComlinkWorker => { + if (runningInBrowser()) { + const worker = new Worker( + new URL('worker/convert.worker.js', import.meta.url), + { name: 'ente-convert-worker' } + ); + const comlink = Comlink.wrap(worker); + return { comlink, worker }; + } +}; +export const ConvertWorker: any = getDedicatedConvertWorker()?.comlink; diff --git a/src/utils/crypto/index.ts b/src/utils/crypto/index.ts index 3b0604393..4fcc18f69 100644 --- a/src/utils/crypto/index.ts +++ b/src/utils/crypto/index.ts @@ -6,11 +6,7 @@ import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; import { getActualKey, getToken } from 'utils/common/key'; import { setRecoveryKey } from 'services/userService'; import { logError } from 'utils/sentry'; - -export interface ComlinkWorker { - comlink: any; - worker: Worker; -} +import { ComlinkWorker } from 'utils/comlink'; export interface B64EncryptionResult { encryptedData: string; @@ -22,7 +18,7 @@ export const getDedicatedCryptoWorker = (): ComlinkWorker => { if (runningInBrowser()) { const worker = new Worker( new URL('worker/crypto.worker.js', import.meta.url), - { name: 'ente-worker' } + { name: 'ente-crypto-worker' } ); const comlink = Comlink.wrap(worker); return { comlink, worker }; diff --git a/src/utils/file/convertHEIC.ts b/src/utils/file/convertHEIC.ts index 94ade1aaf..28f066bde 100644 --- a/src/utils/file/convertHEIC.ts +++ b/src/utils/file/convertHEIC.ts @@ -1,8 +1,8 @@ import * as HeicConvert from 'heic-convert'; export async function convertHEIC( - format: string, - fileBlob: Blob + fileBlob: Blob, + format: string ): Promise { const filedata = new Uint8Array(await fileBlob.arrayBuffer()); const result = await HeicConvert({ buffer: filedata, format }); diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 3d2fcc10b..42b71b8bd 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -323,13 +323,12 @@ export async function convertForPreview(file: EnteFile, fileBlob: Blob) { } const typeFromExtension = getFileExtension(file.metadata.title); - const worker = await new CryptoWorker(); const reader = new FileReader(); const mimeType = (await getMimeTypeFromBlob(reader, fileBlob)) ?? typeFromExtension; if (isFileHEIC(mimeType)) { - fileBlob = await HEICConverter.convert(worker, fileBlob); + fileBlob = await HEICConverter.convert(fileBlob); } return fileBlob; } diff --git a/src/worker/convert.worker.js b/src/worker/convert.worker.js new file mode 100644 index 000000000..a29a396fd --- /dev/null +++ b/src/worker/convert.worker.js @@ -0,0 +1,10 @@ +import * as Comlink from 'comlink'; +import { convertHEIC } from 'utils/file/convertHEIC'; + +export class Convert { + async convertHEIC(format, file) { + return convertHEIC(format, file); + } +} + +Comlink.expose(Convert); diff --git a/src/worker/crypto.worker.js b/src/worker/crypto.worker.js index cf0d60f4c..d7287fe89 100644 --- a/src/worker/crypto.worker.js +++ b/src/worker/crypto.worker.js @@ -1,6 +1,5 @@ import * as Comlink from 'comlink'; import * as libsodium from 'utils/crypto/libsodium'; -import { convertHEIC } from 'utils/file/convertHEIC'; export class Crypto { async decryptMetadata(encryptedMetadata, header, key) { @@ -148,10 +147,6 @@ export class Crypto { async fromHex(string) { return libsodium.fromHex(string); } - - async convertHEIC(format, file) { - return convertHEIC(format, file); - } } Comlink.expose(Crypto);