diff options
Diffstat (limited to 'src/client/util')
-rw-r--r-- | src/client/util/Import & Export/ImageUtils.ts | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/src/client/util/Import & Export/ImageUtils.ts b/src/client/util/Import & Export/ImageUtils.ts index e2eab9010..23102e051 100644 --- a/src/client/util/Import & Export/ImageUtils.ts +++ b/src/client/util/Import & Export/ImageUtils.ts @@ -41,42 +41,47 @@ export namespace ImageUtils { reader.onerror = e => reject(e); reader.readAsDataURL(blob as Blob); }); - }; - export function createImageDocFromBlob(blob: Blob, options: DocumentOptions, docId: string, nativeWidth: number, nativeHeight: number): Promise<Doc> { + } + export function createImageDocFromBlob(blob: Blob | undefined, options: DocumentOptions & { _nativeWidth: number; _nativeHeight: number }, filename: string): Promise<Doc> { return new Promise((resolve, reject) => { - convertImgBlobToDataURL(blob).then(durl => { - ClientUtils.convertDataUri(durl as string, docId + '_noBgd').then(url => { - const imageSnapshot = Docs.Create.ImageDocument(url, options); - Doc.SetNativeWidth(imageSnapshot[DocData], nativeWidth); - Doc.SetNativeHeight(imageSnapshot[DocData], nativeHeight); - resolve(imageSnapshot); - }).catch(reject); - }).catch(reject); + if (!blob) return reject('No image blob provided'); + convertImgBlobToDataURL(blob) + .then(durl => { + ClientUtils.convertDataUri(durl as string, filename) + .then(url => { + const imageSnapshot = Docs.Create.ImageDocument(url, options); + Doc.SetNativeWidth(imageSnapshot[DocData], options._nativeWidth); + Doc.SetNativeHeight(imageSnapshot[DocData], options._nativeHeight); + resolve(imageSnapshot); + }) + .catch(reject); + }) + .catch(reject); }); } - let backgroundRemovalWorker: Worker|undefined; - const workerCallbackMap = new Map<string, (result: Doc) => void>(); - function getBackgroundRemovalWorker() { + let backgroundRemovalWorker: Worker | undefined; + const workerCallbackMap = new Map<string, { res: (imgBlob: Blob) => unknown; rej: () => unknown }>(); + function getBackgroundRemovalWorker() { if (backgroundRemovalWorker) return backgroundRemovalWorker; backgroundRemovalWorker = new Worker('/image.worker.js', { type: 'module' }); - backgroundRemovalWorker.onerror = (e: ErrorEvent) => console.error('Worker failed:', e); // worker.terminate(); + backgroundRemovalWorker.onerror = (e: ErrorEvent) => { + const docId = (e as ErrorEvent & { docId: string }).docId; + const map = workerCallbackMap.get(docId); + map?.rej(); + workerCallbackMap.delete(docId); // worker.terminate(); + }; backgroundRemovalWorker.onmessage = async (event: MessageEvent) => { - if (event.data.success) { - createImageDocFromBlob(event.data.result, event.data.options, event.data.docId, event.data.nativeWidth, event.data.nativeHeight) - .then(imageSnapshot => { - workerCallbackMap.get(event.data.docId)?.(imageSnapshot); - workerCallbackMap.delete(event.data.docId); - }) - } else { - console.error('Error in background removal:', event.data.error); - } - // worker.terminate(); + const map = workerCallbackMap.get(event.data.docId); + event.data.success ? map?.res(event.data.result) : map?.rej(); + workerCallbackMap.delete(event.data.docId); // worker.terminate(); }; return backgroundRemovalWorker; - } - export function removeImgBackground(options:DocumentOptions, cb: (result: Doc) => void, docId: string, nativeWidth:number, nativeHeight:number, docImgPath: string) { - workerCallbackMap.set(docId, cb); // Store the callback by docId (or use a unique requestId) - getBackgroundRemovalWorker().postMessage({ imagePath: docImgPath, options, docId, nativeWidth, nativeHeight }); - }; + export function removeImgBackground(docId: string, imagePath: string) { + return new Promise<Blob | undefined>((res, rej) => { + if (!imagePath) return rej('No image path provided'); + workerCallbackMap.set(docId, { res, rej }); // Store the callback by docId (or use a unique requestId) + getBackgroundRemovalWorker().postMessage({ imagePath, docId }); + }); + } } |