@embedpdf/engines 2.11.0 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/browser-BpXqcQ3U.cjs +2 -0
  2. package/dist/browser-BpXqcQ3U.cjs.map +1 -0
  3. package/dist/{browser-BISJ9naB.js → browser-BuzIa755.js} +95 -6
  4. package/dist/browser-BuzIa755.js.map +1 -0
  5. package/dist/direct-engine-IJ8DmFTb.cjs +2 -0
  6. package/dist/direct-engine-IJ8DmFTb.cjs.map +1 -0
  7. package/dist/{direct-engine-cyecHjwI.js → direct-engine-oh_i6TH_.js} +7 -7
  8. package/dist/direct-engine-oh_i6TH_.js.map +1 -0
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.js +3 -3
  11. package/dist/lib/converters/index.cjs +1 -1
  12. package/dist/lib/converters/index.js +1 -1
  13. package/dist/lib/image-encoder/bmp.d.ts +13 -0
  14. package/dist/lib/image-encoder/image-encoder-worker.d.ts +1 -1
  15. package/dist/lib/image-encoder/worker-pool.d.ts +1 -1
  16. package/dist/lib/pdfium/index.cjs +1 -1
  17. package/dist/lib/pdfium/index.js +4 -4
  18. package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
  19. package/dist/lib/pdfium/web/direct-engine.js +3 -3
  20. package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
  21. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
  22. package/dist/lib/pdfium/web/worker-engine.js +127 -5
  23. package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
  24. package/dist/{pdf-engine-Dj-haWhC.js → pdf-engine-D9v0RfKe.js} +3 -3
  25. package/dist/pdf-engine-D9v0RfKe.js.map +1 -0
  26. package/dist/pdf-engine-DeiICuca.cjs +2 -0
  27. package/dist/pdf-engine-DeiICuca.cjs.map +1 -0
  28. package/dist/preact/index.cjs +1 -1
  29. package/dist/preact/index.js +1 -1
  30. package/dist/react/index.cjs +1 -1
  31. package/dist/react/index.js +1 -1
  32. package/dist/svelte/index.cjs +1 -1
  33. package/dist/svelte/index.js +1 -1
  34. package/dist/vue/index.cjs +1 -1
  35. package/dist/vue/index.js +1 -1
  36. package/package.json +4 -4
  37. package/dist/browser-13mzox-R.cjs +0 -2
  38. package/dist/browser-13mzox-R.cjs.map +0 -1
  39. package/dist/browser-BISJ9naB.js.map +0 -1
  40. package/dist/direct-engine-BNQEVS9L.cjs +0 -2
  41. package/dist/direct-engine-BNQEVS9L.cjs.map +0 -1
  42. package/dist/direct-engine-cyecHjwI.js.map +0 -1
  43. package/dist/pdf-engine-BoFryxxe.cjs +0 -2
  44. package/dist/pdf-engine-BoFryxxe.cjs.map +0 -1
  45. package/dist/pdf-engine-Dj-haWhC.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"worker-engine.js","sources":["../../../../src/lib/orchestrator/remote-executor.ts","../../../../src/lib/image-encoder/worker-pool.ts"],"sourcesContent":["import {\n BatchProgress,\n Logger,\n NoopLogger,\n PdfDocumentObject,\n PdfPageObject,\n PdfTask,\n PdfErrorReason,\n PdfFile,\n PdfOpenDocumentBufferOptions,\n PdfMetadataObject,\n PdfBookmarksObject,\n PdfBookmarkObject,\n PdfRenderPageOptions,\n PdfRenderThumbnailOptions,\n PdfRenderPageAnnotationOptions,\n PdfAnnotationObject,\n PdfTextRectObject,\n PdfAttachmentObject,\n PdfAddAttachmentParams,\n PdfWidgetAnnoObject,\n PdfWidgetAnnoField,\n PdfDocumentJavaScriptActionObject,\n PdfWidgetJavaScriptActionObject,\n FormFieldValue,\n PdfFlattenPageOptions,\n PdfPageFlattenResult,\n PdfRedactTextOptions,\n Rect,\n PageTextSlice,\n PdfGlyphObject,\n PdfPageGeometry,\n PdfPageTextRuns,\n PdfPrintOptions,\n PdfSignatureObject,\n AnnotationCreateContext,\n Task,\n TaskError,\n PdfErrorCode,\n SearchResult,\n serializeLogger,\n IPdfiumExecutor,\n ImageDataLike,\n AnnotationAppearanceMap,\n} from '@embedpdf/models';\nimport type { WorkerRequest, WorkerResponse } from './pdfium-native-runner';\nimport type { FontFallbackConfig } from '../pdfium/font-fallback';\n\n/**\n * Options for creating a RemoteExecutor\n */\nexport interface RemoteExecutorOptions {\n /**\n * URL to the pdfium.wasm file (required)\n */\n wasmUrl: string;\n /**\n * Logger instance for debugging\n */\n logger?: Logger;\n /**\n * Font fallback configuration for handling missing fonts\n */\n fontFallback?: FontFallbackConfig;\n}\n\nconst LOG_SOURCE = 'RemoteExecutor';\nconst LOG_CATEGORY = 'Worker';\n\n/**\n * Message types for worker communication\n */\ntype MessageType =\n | 'destroy'\n | 'openDocumentBuffer'\n | 'getMetadata'\n | 'setMetadata'\n | 'getDocPermissions'\n | 'getDocUserPermissions'\n | 'getSignatures'\n | 'getBookmarks'\n | 'setBookmarks'\n | 'deleteBookmarks'\n | 'renderPageRaw'\n | 'renderPageRect'\n | 'renderThumbnailRaw'\n | 'renderPageAnnotationRaw'\n | 'renderPageAnnotationsRaw'\n | 'getPageAnnotations'\n | 'getPageAnnotationsRaw'\n | 'createPageAnnotation'\n | 'updatePageAnnotation'\n | 'removePageAnnotation'\n | 'getPageTextRects'\n | 'searchInPage'\n | 'getAnnotationsBatch'\n | 'searchBatch'\n | 'getAttachments'\n | 'addAttachment'\n | 'removeAttachment'\n | 'readAttachmentContent'\n | 'getDocumentJavaScriptActions'\n | 'getPageAnnoWidgets'\n | 'getPageWidgetJavaScriptActions'\n | 'setFormFieldValue'\n | 'setFormFieldState'\n | 'renameWidgetField'\n | 'shareWidgetField'\n | 'regenerateWidgetAppearances'\n | 'flattenPage'\n | 'extractPages'\n | 'createDocument'\n | 'importPages'\n | 'deletePage'\n | 'extractText'\n | 'redactTextInRects'\n | 'applyRedaction'\n | 'applyAllRedactions'\n | 'flattenAnnotation'\n | 'exportAnnotationAppearanceAsPdf'\n | 'exportAnnotationsAppearanceAsPdf'\n | 'getTextSlices'\n | 'getPageGlyphs'\n | 'getPageGeometry'\n | 'getPageTextRuns'\n | 'merge'\n | 'mergePages'\n | 'preparePrintDocument'\n | 'saveAsCopy'\n | 'closeDocument'\n | 'closeAllDocuments'\n | 'setDocumentEncryption'\n | 'removeEncryption'\n | 'unlockOwnerPermissions'\n | 'isEncrypted'\n | 'isOwnerUnlocked';\n\n/**\n * RemoteExecutor - Proxy for worker communication\n *\n * This implements IPdfExecutor but forwards all calls to a Web Worker.\n * It handles:\n * - Serialization/deserialization of messages\n * - Promise/Task conversion\n * - Error handling\n * - Progress tracking\n */\nexport class RemoteExecutor implements IPdfiumExecutor {\n private static READY_TASK_ID = '0';\n private pendingRequests = new Map<string, Task<any, any>>();\n private requestCounter = 0;\n private logger: Logger;\n private readyTask: Task<boolean, PdfErrorReason>;\n\n constructor(\n private worker: Worker,\n options: RemoteExecutorOptions,\n ) {\n this.logger = options.logger ?? new NoopLogger();\n this.worker.addEventListener('message', this.handleMessage);\n\n // Create ready task - will be resolved when worker sends 'ready'\n this.readyTask = new Task<boolean, PdfErrorReason>();\n this.pendingRequests.set(RemoteExecutor.READY_TASK_ID, this.readyTask);\n\n // Send initialization message with WASM URL and font fallback config\n this.worker.postMessage({\n id: RemoteExecutor.READY_TASK_ID,\n type: 'wasmInit',\n wasmUrl: options.wasmUrl,\n logger: options.logger ? serializeLogger(options.logger) : undefined,\n fontFallback: options.fontFallback,\n });\n\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'RemoteExecutor created');\n }\n\n /**\n * Generate unique request ID\n */\n private generateId(): string {\n return `req-${Date.now()}-${this.requestCounter++}`;\n }\n\n /**\n * Send a message to the worker and return a Task\n * Waits for worker to be ready before sending\n */\n private send<T, P = unknown>(method: MessageType, args: any[]): Task<T, PdfErrorReason, P> {\n const id = this.generateId();\n const task = new Task<T, PdfErrorReason, P>();\n\n const request: WorkerRequest = {\n id,\n type: 'execute',\n method,\n args,\n };\n\n // Wait for worker to be ready before sending\n this.readyTask.wait(\n () => {\n this.pendingRequests.set(id, task);\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Sending ${method} request:`, id);\n this.worker.postMessage(request);\n },\n (error) => {\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Worker init failed, rejecting ${method}:`,\n error,\n );\n task.reject({\n code: PdfErrorCode.Initialization,\n message: 'Worker initialization failed',\n });\n },\n );\n\n return task;\n }\n\n /**\n * Handle messages from worker\n */\n private handleMessage = (event: MessageEvent<WorkerResponse>) => {\n const response = event.data;\n\n // Handle ready response - resolve the readyTask\n if (response.type === 'ready') {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'Worker is ready');\n this.readyTask.resolve(true);\n return;\n }\n\n const task = this.pendingRequests.get(response.id);\n\n if (!task) {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Received response for unknown request: ${response.id}`,\n );\n return;\n }\n\n switch (response.type) {\n case 'result':\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Received result for ${response.id}`);\n task.resolve(response.data);\n this.pendingRequests.delete(response.id);\n break;\n\n case 'error':\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Received error for ${response.id}:`,\n response.error,\n );\n if (response.error) {\n task.fail(response.error);\n } else {\n task.reject({ code: PdfErrorCode.Unknown, message: 'Unknown error' });\n }\n this.pendingRequests.delete(response.id);\n break;\n\n case 'progress':\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Received progress for ${response.id}`);\n task.progress(response.progress);\n break;\n }\n };\n\n /**\n * Cleanup and terminate worker\n */\n destroy(): void {\n this.worker.removeEventListener('message', this.handleMessage);\n\n // Reject all pending requests (except readyTask)\n this.pendingRequests.forEach((task, id) => {\n if (id !== RemoteExecutor.READY_TASK_ID) {\n task.abort('Worker destroyed');\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Aborted pending request: ${id}`);\n }\n });\n this.pendingRequests.clear();\n\n this.worker.terminate();\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'RemoteExecutor destroyed');\n }\n\n // ========== IPdfExecutor Implementation ==========\n\n openDocumentBuffer(\n file: PdfFile,\n options?: PdfOpenDocumentBufferOptions,\n ): PdfTask<PdfDocumentObject> {\n return this.send<PdfDocumentObject>('openDocumentBuffer', [file, options]);\n }\n\n getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject> {\n return this.send<PdfMetadataObject>('getMetadata', [doc]);\n }\n\n setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean> {\n return this.send<boolean>('setMetadata', [doc, metadata]);\n }\n\n getDocPermissions(doc: PdfDocumentObject): PdfTask<number> {\n return this.send<number>('getDocPermissions', [doc]);\n }\n\n getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number> {\n return this.send<number>('getDocUserPermissions', [doc]);\n }\n\n getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]> {\n return this.send<PdfSignatureObject[]>('getSignatures', [doc]);\n }\n\n getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject> {\n return this.send<PdfBookmarksObject>('getBookmarks', [doc]);\n }\n\n setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean> {\n return this.send<boolean>('setBookmarks', [doc, bookmarks]);\n }\n\n deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('deleteBookmarks', [doc]);\n }\n\n renderPageRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderPageRaw', [doc, page, options]);\n }\n\n renderPageRect(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderPageRect', [doc, page, rect, options]);\n }\n\n renderThumbnailRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderThumbnailRaw', [doc, page, options]);\n }\n\n renderPageAnnotationRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderPageAnnotationRaw', [doc, page, annotation, options]);\n }\n\n renderPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<AnnotationAppearanceMap> {\n return this.send<AnnotationAppearanceMap>('renderPageAnnotationsRaw', [doc, page, options]);\n }\n\n getPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfAnnotationObject[]> {\n return this.send<PdfAnnotationObject[]>('getPageAnnotationsRaw', [doc, page]);\n }\n\n getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]> {\n return this.send<PdfAnnotationObject[]>('getPageAnnotations', [doc, page]);\n }\n\n createPageAnnotation<A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ): PdfTask<string> {\n return this.send<string>('createPageAnnotation', [doc, page, annotation, context]);\n }\n\n updatePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: { regenerateAppearance?: boolean },\n ): PdfTask<boolean> {\n return this.send<boolean>('updatePageAnnotation', [doc, page, annotation, options]);\n }\n\n removePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('removePageAnnotation', [doc, page, annotation]);\n }\n\n getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]> {\n return this.send<PdfTextRectObject[]>('getPageTextRects', [doc, page]);\n }\n\n searchInPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n keyword: string,\n flags: number,\n ): PdfTask<SearchResult[]> {\n return this.send<SearchResult[]>('searchInPage', [doc, page, keyword, flags]);\n }\n\n getAnnotationsBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n ): PdfTask<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>> {\n return this.send<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>>(\n 'getAnnotationsBatch',\n [doc, pages],\n );\n }\n\n searchBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n keyword: string,\n flags: number,\n ): PdfTask<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>> {\n return this.send<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>>('searchBatch', [\n doc,\n pages,\n keyword,\n flags,\n ]);\n }\n\n getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]> {\n return this.send<PdfAttachmentObject[]>('getAttachments', [doc]);\n }\n\n addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean> {\n return this.send<boolean>('addAttachment', [doc, params]);\n }\n\n removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean> {\n return this.send<boolean>('removeAttachment', [doc, attachment]);\n }\n\n readAttachmentContent(\n doc: PdfDocumentObject,\n attachment: PdfAttachmentObject,\n ): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('readAttachmentContent', [doc, attachment]);\n }\n\n getDocumentJavaScriptActions(\n doc: PdfDocumentObject,\n ): PdfTask<PdfDocumentJavaScriptActionObject[]> {\n return this.send<PdfDocumentJavaScriptActionObject[]>('getDocumentJavaScriptActions', [doc]);\n }\n\n getPageAnnoWidgets(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfWidgetAnnoObject[]> {\n return this.send<PdfWidgetAnnoObject[]>('getPageAnnoWidgets', [doc, page]);\n }\n\n getPageWidgetJavaScriptActions(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfWidgetJavaScriptActionObject[]> {\n return this.send<PdfWidgetJavaScriptActionObject[]>('getPageWidgetJavaScriptActions', [\n doc,\n page,\n ]);\n }\n\n setFormFieldValue(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ): PdfTask<boolean> {\n return this.send<boolean>('setFormFieldValue', [doc, page, annotation, value]);\n }\n\n setFormFieldState(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n field: PdfWidgetAnnoField,\n ): PdfTask<boolean> {\n return this.send<boolean>('setFormFieldState', [doc, page, annotation, field]);\n }\n\n renameWidgetField(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n name: string,\n ): PdfTask<boolean> {\n return this.send<boolean>('renameWidgetField', [doc, page, annotation, name]);\n }\n\n shareWidgetField(\n doc: PdfDocumentObject,\n sourcePage: PdfPageObject,\n sourceAnnotation: PdfWidgetAnnoObject,\n targetPage: PdfPageObject,\n targetAnnotation: PdfWidgetAnnoObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('shareWidgetField', [\n doc,\n sourcePage,\n sourceAnnotation,\n targetPage,\n targetAnnotation,\n ]);\n }\n\n regenerateWidgetAppearances(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotationIds: string[],\n ): PdfTask<boolean> {\n return this.send<boolean>('regenerateWidgetAppearances', [doc, page, annotationIds]);\n }\n\n flattenPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ): PdfTask<PdfPageFlattenResult> {\n return this.send<PdfPageFlattenResult>('flattenPage', [doc, page, options]);\n }\n\n extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('extractPages', [doc, pageIndexes]);\n }\n\n createDocument(id: string): PdfTask<PdfDocumentObject> {\n return this.send<PdfDocumentObject>('createDocument', [id]);\n }\n\n importPages(\n destDoc: PdfDocumentObject,\n srcDoc: PdfDocumentObject,\n srcPageIndices: number[],\n insertIndex?: number,\n ): PdfTask<PdfPageObject[]> {\n return this.send<PdfPageObject[]>('importPages', [\n destDoc,\n srcDoc,\n srcPageIndices,\n insertIndex,\n ]);\n }\n\n deletePage(doc: PdfDocumentObject, pageIndex: number): PdfTask<boolean> {\n return this.send<boolean>('deletePage', [doc, pageIndex]);\n }\n\n extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string> {\n return this.send<string>('extractText', [doc, pageIndexes]);\n }\n\n redactTextInRects(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ): PdfTask<boolean> {\n return this.send<boolean>('redactTextInRects', [doc, page, rects, options]);\n }\n\n applyRedaction(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('applyRedaction', [doc, page, annotation]);\n }\n\n applyAllRedactions(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<boolean> {\n return this.send<boolean>('applyAllRedactions', [doc, page]);\n }\n\n flattenAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('flattenAnnotation', [doc, page, annotation]);\n }\n\n exportAnnotationAppearanceAsPdf(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('exportAnnotationAppearanceAsPdf', [doc, page, annotation]);\n }\n\n exportAnnotationsAppearanceAsPdf(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotations: PdfAnnotationObject[],\n ): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('exportAnnotationsAppearanceAsPdf', [doc, page, annotations]);\n }\n\n getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]> {\n return this.send<string[]>('getTextSlices', [doc, slices]);\n }\n\n getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]> {\n return this.send<PdfGlyphObject[]>('getPageGlyphs', [doc, page]);\n }\n\n getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry> {\n return this.send<PdfPageGeometry>('getPageGeometry', [doc, page]);\n }\n\n getPageTextRuns(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageTextRuns> {\n return this.send<PdfPageTextRuns>('getPageTextRuns', [doc, page]);\n }\n\n merge(files: PdfFile[]): PdfTask<PdfFile> {\n return this.send<PdfFile>('merge', [files]);\n }\n\n mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>): PdfTask<PdfFile> {\n return this.send<PdfFile>('mergePages', [mergeConfigs]);\n }\n\n preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('preparePrintDocument', [doc, options]);\n }\n\n saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('saveAsCopy', [doc]);\n }\n\n closeDocument(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('closeDocument', [doc]);\n }\n\n closeAllDocuments(): PdfTask<boolean> {\n return this.send<boolean>('closeAllDocuments', []);\n }\n\n setDocumentEncryption(\n doc: PdfDocumentObject,\n userPassword: string,\n ownerPassword: string,\n allowedFlags: number,\n ): PdfTask<boolean> {\n return this.send<boolean>('setDocumentEncryption', [\n doc,\n userPassword,\n ownerPassword,\n allowedFlags,\n ]);\n }\n\n removeEncryption(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('removeEncryption', [doc]);\n }\n\n unlockOwnerPermissions(doc: PdfDocumentObject, ownerPassword: string): PdfTask<boolean> {\n return this.send<boolean>('unlockOwnerPermissions', [doc, ownerPassword]);\n }\n\n isEncrypted(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('isEncrypted', [doc]);\n }\n\n isOwnerUnlocked(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('isOwnerUnlocked', [doc]);\n }\n}\n","import { Logger, NoopLogger } from '@embedpdf/models';\nimport type { EncodeImageRequest, EncodeImageResponse } from './image-encoder-worker';\n\nconst LOG_SOURCE = 'ImageEncoderPool';\nconst LOG_CATEGORY = 'Encoder';\n\ninterface EncodingTask {\n resolve: (blob: Blob) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Pool of image encoding workers to offload OffscreenCanvas operations\n * from the main PDFium worker thread\n */\nexport class ImageEncoderWorkerPool {\n private workers: Worker[] = [];\n private pendingTasks = new Map<string, EncodingTask>();\n private nextWorkerId = 0;\n private requestCounter = 0;\n private logger: Logger;\n\n /**\n * Create a pool of image encoding workers\n * @param poolSize - Number of workers to create (default: 2)\n * @param workerUrl - URL to the worker script\n * @param logger - Logger instance\n */\n constructor(\n private poolSize: number = 2,\n private workerUrl: string,\n logger?: Logger,\n ) {\n this.logger = logger ?? new NoopLogger();\n this.initialize();\n }\n\n /**\n * Initialize the worker pool\n */\n private initialize() {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Creating worker pool with ${this.poolSize} workers`,\n );\n\n for (let i = 0; i < this.poolSize; i++) {\n try {\n const worker = new Worker(this.workerUrl, { type: 'module' });\n worker.onmessage = this.handleWorkerMessage.bind(this);\n worker.onerror = this.handleWorkerError.bind(this);\n this.workers.push(worker);\n\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Worker ${i} created successfully`);\n } catch (error) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, `Failed to create worker ${i}:`, error);\n }\n }\n }\n\n /**\n * Handle messages from workers\n */\n private handleWorkerMessage(event: MessageEvent<EncodeImageResponse>) {\n const response = event.data;\n const task = this.pendingTasks.get(response.id);\n\n if (!task) {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Received response for unknown task: ${response.id}`,\n );\n return;\n }\n\n this.pendingTasks.delete(response.id);\n\n if (response.type === 'result') {\n task.resolve(response.data as Blob);\n } else {\n const errorData = response.data as { message: string };\n task.reject(new Error(errorData.message));\n }\n }\n\n /**\n * Handle worker errors\n */\n private handleWorkerError(error: ErrorEvent) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, 'Worker error:', error.message);\n }\n\n /**\n * Get the next available worker using round-robin\n */\n private getNextWorker(): Worker | null {\n if (this.workers.length === 0) {\n return null;\n }\n\n const worker = this.workers[this.nextWorkerId];\n this.nextWorkerId = (this.nextWorkerId + 1) % this.workers.length;\n return worker;\n }\n\n /**\n * Encode ImageData to Blob using a worker from the pool\n * @param imageData - Raw image data\n * @param imageType - Target image format\n * @param quality - Image quality (0-1) for lossy formats\n * @returns Promise that resolves to encoded Blob\n */\n encode(\n imageData: { data: Uint8ClampedArray; width: number; height: number },\n imageType: 'image/png' | 'image/jpeg' | 'image/webp' = 'image/webp',\n quality?: number,\n ): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const worker = this.getNextWorker();\n\n if (!worker) {\n reject(new Error('No workers available in the pool'));\n return;\n }\n\n const requestId = `encode-${Date.now()}-${this.requestCounter++}`;\n this.pendingTasks.set(requestId, { resolve, reject });\n\n const request: EncodeImageRequest = {\n id: requestId,\n type: 'encode',\n data: {\n imageData: {\n data: imageData.data,\n width: imageData.width,\n height: imageData.height,\n },\n imageType,\n quality,\n },\n };\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Sending encoding request ${requestId} (${imageData.width}x${imageData.height})`,\n );\n\n // Transfer the buffer for better performance\n worker.postMessage(request, [imageData.data.buffer]);\n });\n }\n\n /**\n * Destroy all workers in the pool\n */\n destroy() {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'Destroying worker pool');\n\n // Reject all pending tasks\n this.pendingTasks.forEach((task, id) => {\n task.reject(new Error('Worker pool destroyed'));\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Rejected pending task: ${id}`);\n });\n this.pendingTasks.clear();\n\n // Terminate all workers\n this.workers.forEach((worker, index) => {\n worker.terminate();\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Worker ${index} terminated`);\n });\n this.workers = [];\n }\n\n /**\n * Get the number of active workers in the pool\n */\n get activeWorkers(): number {\n return this.workers.length;\n }\n\n /**\n * Get the number of pending encoding tasks\n */\n get pendingTasksCount(): number {\n return this.pendingTasks.size;\n }\n}\n"],"names":["LOG_SOURCE","LOG_CATEGORY"],"mappings":"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"}
1
+ {"version":3,"file":"worker-engine.js","sources":["../../../../src/lib/orchestrator/remote-executor.ts","../../../../src/lib/image-encoder/worker-pool.ts"],"sourcesContent":["import {\n BatchProgress,\n Logger,\n NoopLogger,\n PdfDocumentObject,\n PdfPageObject,\n PdfTask,\n PdfErrorReason,\n PdfFile,\n PdfOpenDocumentBufferOptions,\n PdfMetadataObject,\n PdfBookmarksObject,\n PdfBookmarkObject,\n PdfRenderPageOptions,\n PdfRenderThumbnailOptions,\n PdfRenderPageAnnotationOptions,\n PdfAnnotationObject,\n PdfTextRectObject,\n PdfAttachmentObject,\n PdfAddAttachmentParams,\n PdfWidgetAnnoObject,\n PdfWidgetAnnoField,\n PdfDocumentJavaScriptActionObject,\n PdfWidgetJavaScriptActionObject,\n FormFieldValue,\n PdfFlattenPageOptions,\n PdfPageFlattenResult,\n PdfRedactTextOptions,\n Rect,\n PageTextSlice,\n PdfGlyphObject,\n PdfPageGeometry,\n PdfPageTextRuns,\n PdfPrintOptions,\n PdfSignatureObject,\n AnnotationCreateContext,\n Task,\n TaskError,\n PdfErrorCode,\n SearchResult,\n serializeLogger,\n IPdfiumExecutor,\n ImageDataLike,\n AnnotationAppearanceMap,\n} from '@embedpdf/models';\nimport type { WorkerRequest, WorkerResponse } from './pdfium-native-runner';\nimport type { FontFallbackConfig } from '../pdfium/font-fallback';\n\n/**\n * Options for creating a RemoteExecutor\n */\nexport interface RemoteExecutorOptions {\n /**\n * URL to the pdfium.wasm file (required)\n */\n wasmUrl: string;\n /**\n * Logger instance for debugging\n */\n logger?: Logger;\n /**\n * Font fallback configuration for handling missing fonts\n */\n fontFallback?: FontFallbackConfig;\n}\n\nconst LOG_SOURCE = 'RemoteExecutor';\nconst LOG_CATEGORY = 'Worker';\n\n/**\n * Message types for worker communication\n */\ntype MessageType =\n | 'destroy'\n | 'openDocumentBuffer'\n | 'getMetadata'\n | 'setMetadata'\n | 'getDocPermissions'\n | 'getDocUserPermissions'\n | 'getSignatures'\n | 'getBookmarks'\n | 'setBookmarks'\n | 'deleteBookmarks'\n | 'renderPageRaw'\n | 'renderPageRect'\n | 'renderThumbnailRaw'\n | 'renderPageAnnotationRaw'\n | 'renderPageAnnotationsRaw'\n | 'getPageAnnotations'\n | 'getPageAnnotationsRaw'\n | 'createPageAnnotation'\n | 'updatePageAnnotation'\n | 'removePageAnnotation'\n | 'getPageTextRects'\n | 'searchInPage'\n | 'getAnnotationsBatch'\n | 'searchBatch'\n | 'getAttachments'\n | 'addAttachment'\n | 'removeAttachment'\n | 'readAttachmentContent'\n | 'getDocumentJavaScriptActions'\n | 'getPageAnnoWidgets'\n | 'getPageWidgetJavaScriptActions'\n | 'setFormFieldValue'\n | 'setFormFieldState'\n | 'renameWidgetField'\n | 'shareWidgetField'\n | 'regenerateWidgetAppearances'\n | 'flattenPage'\n | 'extractPages'\n | 'createDocument'\n | 'importPages'\n | 'deletePage'\n | 'extractText'\n | 'redactTextInRects'\n | 'applyRedaction'\n | 'applyAllRedactions'\n | 'flattenAnnotation'\n | 'exportAnnotationAppearanceAsPdf'\n | 'exportAnnotationsAppearanceAsPdf'\n | 'getTextSlices'\n | 'getPageGlyphs'\n | 'getPageGeometry'\n | 'getPageTextRuns'\n | 'merge'\n | 'mergePages'\n | 'preparePrintDocument'\n | 'saveAsCopy'\n | 'closeDocument'\n | 'closeAllDocuments'\n | 'setDocumentEncryption'\n | 'removeEncryption'\n | 'unlockOwnerPermissions'\n | 'isEncrypted'\n | 'isOwnerUnlocked';\n\n/**\n * RemoteExecutor - Proxy for worker communication\n *\n * This implements IPdfExecutor but forwards all calls to a Web Worker.\n * It handles:\n * - Serialization/deserialization of messages\n * - Promise/Task conversion\n * - Error handling\n * - Progress tracking\n */\nexport class RemoteExecutor implements IPdfiumExecutor {\n private static READY_TASK_ID = '0';\n private pendingRequests = new Map<string, Task<any, any>>();\n private requestCounter = 0;\n private logger: Logger;\n private readyTask: Task<boolean, PdfErrorReason>;\n\n constructor(\n private worker: Worker,\n options: RemoteExecutorOptions,\n ) {\n this.logger = options.logger ?? new NoopLogger();\n this.worker.addEventListener('message', this.handleMessage);\n\n // Create ready task - will be resolved when worker sends 'ready'\n this.readyTask = new Task<boolean, PdfErrorReason>();\n this.pendingRequests.set(RemoteExecutor.READY_TASK_ID, this.readyTask);\n\n // Send initialization message with WASM URL and font fallback config\n this.worker.postMessage({\n id: RemoteExecutor.READY_TASK_ID,\n type: 'wasmInit',\n wasmUrl: options.wasmUrl,\n logger: options.logger ? serializeLogger(options.logger) : undefined,\n fontFallback: options.fontFallback,\n });\n\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'RemoteExecutor created');\n }\n\n /**\n * Generate unique request ID\n */\n private generateId(): string {\n return `req-${Date.now()}-${this.requestCounter++}`;\n }\n\n /**\n * Send a message to the worker and return a Task\n * Waits for worker to be ready before sending\n */\n private send<T, P = unknown>(method: MessageType, args: any[]): Task<T, PdfErrorReason, P> {\n const id = this.generateId();\n const task = new Task<T, PdfErrorReason, P>();\n\n const request: WorkerRequest = {\n id,\n type: 'execute',\n method,\n args,\n };\n\n // Wait for worker to be ready before sending\n this.readyTask.wait(\n () => {\n this.pendingRequests.set(id, task);\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Sending ${method} request:`, id);\n this.worker.postMessage(request);\n },\n (error) => {\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Worker init failed, rejecting ${method}:`,\n error,\n );\n task.reject({\n code: PdfErrorCode.Initialization,\n message: 'Worker initialization failed',\n });\n },\n );\n\n return task;\n }\n\n /**\n * Handle messages from worker\n */\n private handleMessage = (event: MessageEvent<WorkerResponse>) => {\n const response = event.data;\n\n // Handle ready response - resolve the readyTask\n if (response.type === 'ready') {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'Worker is ready');\n this.readyTask.resolve(true);\n return;\n }\n\n const task = this.pendingRequests.get(response.id);\n\n if (!task) {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Received response for unknown request: ${response.id}`,\n );\n return;\n }\n\n switch (response.type) {\n case 'result':\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Received result for ${response.id}`);\n task.resolve(response.data);\n this.pendingRequests.delete(response.id);\n break;\n\n case 'error':\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Received error for ${response.id}:`,\n response.error,\n );\n if (response.error) {\n task.fail(response.error);\n } else {\n task.reject({ code: PdfErrorCode.Unknown, message: 'Unknown error' });\n }\n this.pendingRequests.delete(response.id);\n break;\n\n case 'progress':\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Received progress for ${response.id}`);\n task.progress(response.progress);\n break;\n }\n };\n\n /**\n * Cleanup and terminate worker\n */\n destroy(): void {\n this.worker.removeEventListener('message', this.handleMessage);\n\n // Reject all pending requests (except readyTask)\n this.pendingRequests.forEach((task, id) => {\n if (id !== RemoteExecutor.READY_TASK_ID) {\n task.abort('Worker destroyed');\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Aborted pending request: ${id}`);\n }\n });\n this.pendingRequests.clear();\n\n this.worker.terminate();\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'RemoteExecutor destroyed');\n }\n\n // ========== IPdfExecutor Implementation ==========\n\n openDocumentBuffer(\n file: PdfFile,\n options?: PdfOpenDocumentBufferOptions,\n ): PdfTask<PdfDocumentObject> {\n return this.send<PdfDocumentObject>('openDocumentBuffer', [file, options]);\n }\n\n getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject> {\n return this.send<PdfMetadataObject>('getMetadata', [doc]);\n }\n\n setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean> {\n return this.send<boolean>('setMetadata', [doc, metadata]);\n }\n\n getDocPermissions(doc: PdfDocumentObject): PdfTask<number> {\n return this.send<number>('getDocPermissions', [doc]);\n }\n\n getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number> {\n return this.send<number>('getDocUserPermissions', [doc]);\n }\n\n getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]> {\n return this.send<PdfSignatureObject[]>('getSignatures', [doc]);\n }\n\n getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject> {\n return this.send<PdfBookmarksObject>('getBookmarks', [doc]);\n }\n\n setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean> {\n return this.send<boolean>('setBookmarks', [doc, bookmarks]);\n }\n\n deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('deleteBookmarks', [doc]);\n }\n\n renderPageRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderPageRaw', [doc, page, options]);\n }\n\n renderPageRect(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderPageRect', [doc, page, rect, options]);\n }\n\n renderThumbnailRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderThumbnailRaw', [doc, page, options]);\n }\n\n renderPageAnnotationRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<ImageDataLike> {\n return this.send<ImageDataLike>('renderPageAnnotationRaw', [doc, page, annotation, options]);\n }\n\n renderPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<AnnotationAppearanceMap> {\n return this.send<AnnotationAppearanceMap>('renderPageAnnotationsRaw', [doc, page, options]);\n }\n\n getPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfAnnotationObject[]> {\n return this.send<PdfAnnotationObject[]>('getPageAnnotationsRaw', [doc, page]);\n }\n\n getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]> {\n return this.send<PdfAnnotationObject[]>('getPageAnnotations', [doc, page]);\n }\n\n createPageAnnotation<A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ): PdfTask<string> {\n return this.send<string>('createPageAnnotation', [doc, page, annotation, context]);\n }\n\n updatePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: { regenerateAppearance?: boolean },\n ): PdfTask<boolean> {\n return this.send<boolean>('updatePageAnnotation', [doc, page, annotation, options]);\n }\n\n removePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('removePageAnnotation', [doc, page, annotation]);\n }\n\n getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]> {\n return this.send<PdfTextRectObject[]>('getPageTextRects', [doc, page]);\n }\n\n searchInPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n keyword: string,\n flags: number,\n ): PdfTask<SearchResult[]> {\n return this.send<SearchResult[]>('searchInPage', [doc, page, keyword, flags]);\n }\n\n getAnnotationsBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n ): PdfTask<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>> {\n return this.send<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>>(\n 'getAnnotationsBatch',\n [doc, pages],\n );\n }\n\n searchBatch(\n doc: PdfDocumentObject,\n pages: PdfPageObject[],\n keyword: string,\n flags: number,\n ): PdfTask<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>> {\n return this.send<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>>('searchBatch', [\n doc,\n pages,\n keyword,\n flags,\n ]);\n }\n\n getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]> {\n return this.send<PdfAttachmentObject[]>('getAttachments', [doc]);\n }\n\n addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean> {\n return this.send<boolean>('addAttachment', [doc, params]);\n }\n\n removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean> {\n return this.send<boolean>('removeAttachment', [doc, attachment]);\n }\n\n readAttachmentContent(\n doc: PdfDocumentObject,\n attachment: PdfAttachmentObject,\n ): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('readAttachmentContent', [doc, attachment]);\n }\n\n getDocumentJavaScriptActions(\n doc: PdfDocumentObject,\n ): PdfTask<PdfDocumentJavaScriptActionObject[]> {\n return this.send<PdfDocumentJavaScriptActionObject[]>('getDocumentJavaScriptActions', [doc]);\n }\n\n getPageAnnoWidgets(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfWidgetAnnoObject[]> {\n return this.send<PdfWidgetAnnoObject[]>('getPageAnnoWidgets', [doc, page]);\n }\n\n getPageWidgetJavaScriptActions(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfWidgetJavaScriptActionObject[]> {\n return this.send<PdfWidgetJavaScriptActionObject[]>('getPageWidgetJavaScriptActions', [\n doc,\n page,\n ]);\n }\n\n setFormFieldValue(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ): PdfTask<boolean> {\n return this.send<boolean>('setFormFieldValue', [doc, page, annotation, value]);\n }\n\n setFormFieldState(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n field: PdfWidgetAnnoField,\n ): PdfTask<boolean> {\n return this.send<boolean>('setFormFieldState', [doc, page, annotation, field]);\n }\n\n renameWidgetField(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n name: string,\n ): PdfTask<boolean> {\n return this.send<boolean>('renameWidgetField', [doc, page, annotation, name]);\n }\n\n shareWidgetField(\n doc: PdfDocumentObject,\n sourcePage: PdfPageObject,\n sourceAnnotation: PdfWidgetAnnoObject,\n targetPage: PdfPageObject,\n targetAnnotation: PdfWidgetAnnoObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('shareWidgetField', [\n doc,\n sourcePage,\n sourceAnnotation,\n targetPage,\n targetAnnotation,\n ]);\n }\n\n regenerateWidgetAppearances(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotationIds: string[],\n ): PdfTask<boolean> {\n return this.send<boolean>('regenerateWidgetAppearances', [doc, page, annotationIds]);\n }\n\n flattenPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ): PdfTask<PdfPageFlattenResult> {\n return this.send<PdfPageFlattenResult>('flattenPage', [doc, page, options]);\n }\n\n extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('extractPages', [doc, pageIndexes]);\n }\n\n createDocument(id: string): PdfTask<PdfDocumentObject> {\n return this.send<PdfDocumentObject>('createDocument', [id]);\n }\n\n importPages(\n destDoc: PdfDocumentObject,\n srcDoc: PdfDocumentObject,\n srcPageIndices: number[],\n insertIndex?: number,\n ): PdfTask<PdfPageObject[]> {\n return this.send<PdfPageObject[]>('importPages', [\n destDoc,\n srcDoc,\n srcPageIndices,\n insertIndex,\n ]);\n }\n\n deletePage(doc: PdfDocumentObject, pageIndex: number): PdfTask<boolean> {\n return this.send<boolean>('deletePage', [doc, pageIndex]);\n }\n\n extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string> {\n return this.send<string>('extractText', [doc, pageIndexes]);\n }\n\n redactTextInRects(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ): PdfTask<boolean> {\n return this.send<boolean>('redactTextInRects', [doc, page, rects, options]);\n }\n\n applyRedaction(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('applyRedaction', [doc, page, annotation]);\n }\n\n applyAllRedactions(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<boolean> {\n return this.send<boolean>('applyAllRedactions', [doc, page]);\n }\n\n flattenAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.send<boolean>('flattenAnnotation', [doc, page, annotation]);\n }\n\n exportAnnotationAppearanceAsPdf(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('exportAnnotationAppearanceAsPdf', [doc, page, annotation]);\n }\n\n exportAnnotationsAppearanceAsPdf(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotations: PdfAnnotationObject[],\n ): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('exportAnnotationsAppearanceAsPdf', [doc, page, annotations]);\n }\n\n getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]> {\n return this.send<string[]>('getTextSlices', [doc, slices]);\n }\n\n getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]> {\n return this.send<PdfGlyphObject[]>('getPageGlyphs', [doc, page]);\n }\n\n getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry> {\n return this.send<PdfPageGeometry>('getPageGeometry', [doc, page]);\n }\n\n getPageTextRuns(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageTextRuns> {\n return this.send<PdfPageTextRuns>('getPageTextRuns', [doc, page]);\n }\n\n merge(files: PdfFile[]): PdfTask<PdfFile> {\n return this.send<PdfFile>('merge', [files]);\n }\n\n mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>): PdfTask<PdfFile> {\n return this.send<PdfFile>('mergePages', [mergeConfigs]);\n }\n\n preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('preparePrintDocument', [doc, options]);\n }\n\n saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer> {\n return this.send<ArrayBuffer>('saveAsCopy', [doc]);\n }\n\n closeDocument(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('closeDocument', [doc]);\n }\n\n closeAllDocuments(): PdfTask<boolean> {\n return this.send<boolean>('closeAllDocuments', []);\n }\n\n setDocumentEncryption(\n doc: PdfDocumentObject,\n userPassword: string,\n ownerPassword: string,\n allowedFlags: number,\n ): PdfTask<boolean> {\n return this.send<boolean>('setDocumentEncryption', [\n doc,\n userPassword,\n ownerPassword,\n allowedFlags,\n ]);\n }\n\n removeEncryption(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('removeEncryption', [doc]);\n }\n\n unlockOwnerPermissions(doc: PdfDocumentObject, ownerPassword: string): PdfTask<boolean> {\n return this.send<boolean>('unlockOwnerPermissions', [doc, ownerPassword]);\n }\n\n isEncrypted(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('isEncrypted', [doc]);\n }\n\n isOwnerUnlocked(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.send<boolean>('isOwnerUnlocked', [doc]);\n }\n}\n","import { Logger, NoopLogger } from '@embedpdf/models';\nimport type { EncodeImageRequest, EncodeImageResponse } from './image-encoder-worker';\n\nconst LOG_SOURCE = 'ImageEncoderPool';\nconst LOG_CATEGORY = 'Encoder';\n\ninterface EncodingTask {\n resolve: (blob: Blob) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Pool of image encoding workers to offload OffscreenCanvas operations\n * from the main PDFium worker thread\n */\nexport class ImageEncoderWorkerPool {\n private workers: Worker[] = [];\n private pendingTasks = new Map<string, EncodingTask>();\n private nextWorkerId = 0;\n private requestCounter = 0;\n private logger: Logger;\n\n /**\n * Create a pool of image encoding workers\n * @param poolSize - Number of workers to create (default: 2)\n * @param workerUrl - URL to the worker script\n * @param logger - Logger instance\n */\n constructor(\n private poolSize: number = 2,\n private workerUrl: string,\n logger?: Logger,\n ) {\n this.logger = logger ?? new NoopLogger();\n this.initialize();\n }\n\n /**\n * Initialize the worker pool\n */\n private initialize() {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Creating worker pool with ${this.poolSize} workers`,\n );\n\n for (let i = 0; i < this.poolSize; i++) {\n try {\n const worker = new Worker(this.workerUrl, { type: 'module' });\n worker.onmessage = this.handleWorkerMessage.bind(this);\n worker.onerror = this.handleWorkerError.bind(this);\n this.workers.push(worker);\n\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Worker ${i} created successfully`);\n } catch (error) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, `Failed to create worker ${i}:`, error);\n }\n }\n }\n\n /**\n * Handle messages from workers\n */\n private handleWorkerMessage(event: MessageEvent<EncodeImageResponse>) {\n const response = event.data;\n const task = this.pendingTasks.get(response.id);\n\n if (!task) {\n this.logger.warn(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Received response for unknown task: ${response.id}`,\n );\n return;\n }\n\n this.pendingTasks.delete(response.id);\n\n if (response.type === 'result') {\n task.resolve(response.data as Blob);\n } else {\n const errorData = response.data as { message: string };\n task.reject(new Error(errorData.message));\n }\n }\n\n /**\n * Handle worker errors\n */\n private handleWorkerError(error: ErrorEvent) {\n this.logger.error(LOG_SOURCE, LOG_CATEGORY, 'Worker error:', error.message);\n }\n\n /**\n * Get the next available worker using round-robin\n */\n private getNextWorker(): Worker | null {\n if (this.workers.length === 0) {\n return null;\n }\n\n const worker = this.workers[this.nextWorkerId];\n this.nextWorkerId = (this.nextWorkerId + 1) % this.workers.length;\n return worker;\n }\n\n /**\n * Encode ImageData to Blob using a worker from the pool\n * @param imageData - Raw image data\n * @param imageType - Target image format\n * @param quality - Image quality (0-1) for lossy formats\n * @returns Promise that resolves to encoded Blob\n */\n encode(\n imageData: { data: Uint8ClampedArray; width: number; height: number },\n imageType: 'image/png' | 'image/jpeg' | 'image/webp' | 'image/bmp' = 'image/png',\n quality?: number,\n ): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const worker = this.getNextWorker();\n\n if (!worker) {\n reject(new Error('No workers available in the pool'));\n return;\n }\n\n const requestId = `encode-${Date.now()}-${this.requestCounter++}`;\n this.pendingTasks.set(requestId, { resolve, reject });\n\n const request: EncodeImageRequest = {\n id: requestId,\n type: 'encode',\n data: {\n imageData: {\n data: imageData.data,\n width: imageData.width,\n height: imageData.height,\n },\n imageType,\n quality,\n },\n };\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Sending encoding request ${requestId} (${imageData.width}x${imageData.height})`,\n );\n\n // Transfer the buffer for better performance\n worker.postMessage(request, [imageData.data.buffer]);\n });\n }\n\n /**\n * Destroy all workers in the pool\n */\n destroy() {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'Destroying worker pool');\n\n // Reject all pending tasks\n this.pendingTasks.forEach((task, id) => {\n task.reject(new Error('Worker pool destroyed'));\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Rejected pending task: ${id}`);\n });\n this.pendingTasks.clear();\n\n // Terminate all workers\n this.workers.forEach((worker, index) => {\n worker.terminate();\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Worker ${index} terminated`);\n });\n this.workers = [];\n }\n\n /**\n * Get the number of active workers in the pool\n */\n get activeWorkers(): number {\n return this.workers.length;\n }\n\n /**\n * Get the number of pending encoding tasks\n */\n get pendingTasksCount(): number {\n return this.pendingTasks.size;\n }\n}\n"],"names":["LOG_SOURCE","LOG_CATEGORY"],"mappings":"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"}
@@ -544,7 +544,7 @@ class PdfEngine {
544
544
  * Encode image using encoder pool or inline
545
545
  */
546
546
  encodeImage(rawImageData, options, resultTask) {
547
- const imageType = (options == null ? void 0 : options.imageType) ?? "image/webp";
547
+ const imageType = (options == null ? void 0 : options.imageType) ?? "image/png";
548
548
  const quality = options == null ? void 0 : options.quality;
549
549
  const plainImageData = {
550
550
  data: new Uint8ClampedArray(rawImageData.data),
@@ -557,7 +557,7 @@ class PdfEngine {
557
557
  * Encode a full annotation appearance map to the output type T.
558
558
  */
559
559
  encodeAppearanceMap(rawMap, options, resultTask) {
560
- const imageType = (options == null ? void 0 : options.imageType) ?? "image/webp";
560
+ const imageType = (options == null ? void 0 : options.imageType) ?? "image/png";
561
561
  const quality = options == null ? void 0 : options.imageQuality;
562
562
  const convertImage = (rawImageData) => {
563
563
  const plainImageData = {
@@ -1112,4 +1112,4 @@ class PdfEngine {
1112
1112
  export {
1113
1113
  PdfEngine as P
1114
1114
  };
1115
- //# sourceMappingURL=pdf-engine-Dj-haWhC.js.map
1115
+ //# sourceMappingURL=pdf-engine-D9v0RfKe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-engine-D9v0RfKe.js","sources":["../src/lib/orchestrator/task-queue.ts","../src/lib/orchestrator/pdf-engine.ts"],"sourcesContent":["import { Task, TaskError, Logger, NoopLogger } from '@embedpdf/models';\n\nconst LOG_SOURCE = 'TaskQueue';\nconst LOG_CATEGORY = 'Queue';\n\nexport enum Priority {\n CRITICAL = 3,\n HIGH = 2,\n MEDIUM = 1,\n LOW = 0,\n}\n\n// ============================================================================\n// Type Utilities\n// ============================================================================\n\n/**\n * Extract result type from Task\n */\nexport type ExtractTaskResult<T> = T extends Task<infer R, any, any> ? R : never;\n\n/**\n * Extract error type from Task\n */\nexport type ExtractTaskError<T> = T extends Task<any, infer D, any> ? D : never;\n\n/**\n * Extract progress type from Task\n */\nexport type ExtractTaskProgress<T> = T extends Task<any, any, infer P> ? P : never;\n\n// ============================================================================\n// Queue Interfaces\n// ============================================================================\n\nexport interface QueuedTask<T extends Task<any, any, any>> {\n id: string;\n priority: Priority;\n meta?: Record<string, unknown>;\n executeFactory: () => T; // Factory function - called when it's time to execute!\n cancelled?: boolean;\n}\n\nexport interface EnqueueOptions {\n priority?: Priority;\n meta?: Record<string, unknown>;\n fifo?: boolean;\n}\n\nexport type TaskComparator = (a: QueuedTask<any>, b: QueuedTask<any>) => number;\nexport type TaskRanker = (task: QueuedTask<any>) => number;\n\nexport interface WorkerTaskQueueOptions {\n concurrency?: number;\n comparator?: TaskComparator;\n ranker?: TaskRanker;\n onIdle?: () => void;\n maxQueueSize?: number;\n autoStart?: boolean;\n logger?: Logger;\n}\n\n// ============================================================================\n// WorkerTaskQueue - Corrected with Deferred Execution\n// ============================================================================\n\nexport class WorkerTaskQueue {\n private queue: QueuedTask<any>[] = [];\n private running = 0;\n private resultTasks = new Map<string, Task<any, any, any>>();\n private logger: Logger;\n private opts: Required<Omit<WorkerTaskQueueOptions, 'comparator' | 'ranker' | 'logger'>> & {\n comparator?: TaskComparator;\n ranker?: TaskRanker;\n };\n\n constructor(options: WorkerTaskQueueOptions = {}) {\n const {\n concurrency = 1,\n comparator,\n ranker,\n onIdle,\n maxQueueSize,\n autoStart = true,\n logger,\n } = options;\n this.logger = logger ?? new NoopLogger();\n this.opts = {\n concurrency: Math.max(1, concurrency),\n comparator,\n ranker,\n onIdle: onIdle ?? (() => {}),\n maxQueueSize: maxQueueSize ?? Number.POSITIVE_INFINITY,\n autoStart,\n };\n }\n\n setComparator(comparator?: TaskComparator): void {\n this.opts.comparator = comparator;\n }\n\n setRanker(ranker?: TaskRanker): void {\n this.opts.ranker = ranker;\n }\n\n size(): number {\n return this.queue.length;\n }\n\n inFlight(): number {\n return this.running;\n }\n\n isIdle(): boolean {\n return this.queue.length === 0 && this.running === 0;\n }\n\n async drain(): Promise<void> {\n if (this.isIdle()) return;\n await new Promise<void>((resolve) => {\n const check = () => {\n if (this.isIdle()) {\n this.offIdle(check);\n resolve();\n }\n };\n this.onIdle(check);\n });\n }\n\n private idleListeners = new Set<() => void>();\n private notifyIdle() {\n if (this.isIdle()) {\n [...this.idleListeners].forEach((fn) => fn());\n this.idleListeners.clear();\n this.opts.onIdle();\n }\n }\n private onIdle(fn: () => void) {\n this.idleListeners.add(fn);\n }\n private offIdle(fn: () => void) {\n this.idleListeners.delete(fn);\n }\n\n /**\n * Enqueue a task factory - with automatic type inference!\n *\n * The factory function is ONLY called when it's the task's turn to execute.\n *\n * Usage:\n * const task = queue.enqueue({\n * execute: () => this.executor.getMetadata(doc), // Factory - not called yet!\n * meta: { operation: 'getMetadata' }\n * }, { priority: Priority.LOW });\n *\n * The returned task has the SAME type as executor.getMetadata() would return!\n */\n enqueue<T extends Task<any, any, any>>(\n taskDef: {\n execute: () => T; // Factory function that returns Task when called!\n meta?: Record<string, unknown>;\n },\n options: EnqueueOptions = {},\n ): T {\n const id = this.generateId();\n const priority = options.priority ?? Priority.MEDIUM;\n\n // Create a proxy task that we return to the user\n // This task bridges to the real task that will be created later\n const resultTask = new Task<\n ExtractTaskResult<T>,\n ExtractTaskError<T>,\n ExtractTaskProgress<T>\n >() as T;\n\n if (this.queue.length >= this.opts.maxQueueSize) {\n const error = new Error('Queue is full (maxQueueSize reached).');\n resultTask.reject(error as any);\n return resultTask;\n }\n\n // Store the result task for bridging\n this.resultTasks.set(id, resultTask);\n\n const queuedTask: QueuedTask<T> = {\n id,\n priority,\n meta: options.meta ?? taskDef.meta,\n executeFactory: taskDef.execute, // Store factory, don't call it yet!\n };\n\n this.queue.push(queuedTask);\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Task enqueued: ${id} | Priority: ${priority} | Running: ${this.running} | Queued: ${this.queue.length}`,\n );\n\n // Set up automatic abort handling\n // When result task is aborted externally, remove from queue\n const originalAbort = resultTask.abort.bind(resultTask);\n resultTask.abort = (reason: any) => {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Task aborted: ${id}`);\n this.cancel(id);\n originalAbort(reason);\n };\n\n if (this.opts.autoStart) this.process(options.fifo === true);\n\n return resultTask;\n }\n\n /**\n * Cancel/remove a task from the queue\n */\n private cancel(taskId: string): void {\n const before = this.queue.length;\n this.queue = this.queue.filter((t) => {\n if (t.id === taskId) {\n t.cancelled = true;\n return false;\n }\n return true;\n });\n\n this.resultTasks.delete(taskId);\n\n if (before !== this.queue.length) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Task cancelled and removed: ${taskId}`);\n this.kick();\n }\n }\n\n private kick() {\n queueMicrotask(() => this.process());\n }\n\n private async process(fifo = false): Promise<void> {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `process() called | Running: ${this.running} | Concurrency: ${this.opts.concurrency} | Queued: ${this.queue.length}`,\n );\n\n while (this.running < this.opts.concurrency && this.queue.length > 0) {\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Starting new task | Running: ${this.running} | Queued: ${this.queue.length}`,\n );\n\n if (!fifo) this.sortQueue();\n\n const queuedTask = this.queue.shift()!;\n if (queuedTask.cancelled) {\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, `Skipping cancelled task: ${queuedTask.id}`);\n continue;\n }\n\n const resultTask = this.resultTasks.get(queuedTask.id);\n if (!resultTask) continue; // Shouldn't happen, but guard anyway.\n\n this.running++;\n\n // NOW call the factory to create the real task!\n (async () => {\n let realTask: Task<any, any, any> | null = null;\n\n try {\n // Call the factory function NOW - this is when execution actually starts\n realTask = queuedTask.executeFactory();\n\n // Guard against null/undefined return from factory\n if (!realTask) {\n throw new Error('Task factory returned null/undefined');\n }\n\n // Bridge the real task to the result task\n realTask.wait(\n (result) => {\n if (resultTask.state.stage === 0 /* Pending */) {\n resultTask.resolve(result);\n }\n },\n (error) => {\n if (resultTask.state.stage === 0 /* Pending */) {\n if (error.type === 'abort') {\n resultTask.abort(error.reason);\n } else {\n resultTask.reject(error.reason);\n }\n }\n },\n );\n\n // Bridge progress\n realTask.onProgress((progress) => {\n resultTask.progress(progress);\n });\n\n // Wait for completion\n await realTask.toPromise();\n } catch (error) {\n // Handle any errors from factory or execution\n if (resultTask.state.stage === 0 /* Pending */) {\n resultTask.reject(error as any);\n }\n } finally {\n this.resultTasks.delete(queuedTask.id);\n this.running--;\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `Task completed: ${queuedTask.id} | Running: ${this.running} | Queued: ${this.queue.length}`,\n );\n\n if (this.isIdle()) {\n this.notifyIdle();\n } else if (this.queue.length > 0) {\n this.kick();\n }\n }\n })().catch((error) => {\n this.logger.error(\n LOG_SOURCE,\n LOG_CATEGORY,\n 'Unhandled error in task execution wrapper:',\n error,\n );\n this.running = Math.max(0, this.running - 1);\n if (this.isIdle()) {\n this.notifyIdle();\n } else if (this.queue.length > 0) {\n this.kick();\n }\n });\n }\n }\n\n private sortQueue(): void {\n const { comparator, ranker } = this.opts;\n if (comparator) {\n this.queue.sort(comparator);\n return;\n }\n\n const rankCache = new Map<string, number>();\n const getRank = (t: QueuedTask<any>) => {\n if (!ranker) return this.defaultRank(t);\n if (!rankCache.has(t.id)) rankCache.set(t.id, ranker(t));\n return rankCache.get(t.id)!;\n };\n\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n const ar = getRank(a);\n const br = getRank(b);\n if (ar !== br) return br - ar;\n return this.extractTime(a.id) - this.extractTime(b.id);\n });\n }\n\n private defaultRank(_task: QueuedTask<any>): number {\n return 0;\n }\n\n private generateId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n\n private extractTime(id: string): number {\n const t = Number(id.split('-')[0]);\n return Number.isFinite(t) ? t : 0;\n }\n}\n","import {\n BatchProgress,\n Logger,\n NoopLogger,\n PdfEngine as IPdfEngine,\n PdfDocumentObject,\n PdfPageObject,\n PdfTask,\n PdfErrorReason,\n PdfFileUrl,\n PdfFile,\n PdfOpenDocumentUrlOptions,\n PdfOpenDocumentBufferOptions,\n PdfMetadataObject,\n PdfBookmarksObject,\n PdfBookmarkObject,\n PdfRenderPageOptions,\n PdfRenderThumbnailOptions,\n PdfRenderPageAnnotationOptions,\n PdfAnnotationObject,\n PdfTextRectObject,\n PdfSearchAllPagesOptions,\n SearchAllPagesResult,\n PdfPageSearchProgress,\n PdfAnnotationsProgress,\n PdfAttachmentObject,\n PdfAddAttachmentParams,\n PdfDocumentJavaScriptActionObject,\n PdfWidgetAnnoObject,\n PdfWidgetAnnoField,\n PdfWidgetJavaScriptActionObject,\n FormFieldValue,\n PdfFlattenPageOptions,\n PdfPageFlattenResult,\n PdfRedactTextOptions,\n Rect,\n PageTextSlice,\n PdfGlyphObject,\n PdfPageGeometry,\n PdfPageTextRuns,\n PdfPrintOptions,\n PdfEngineFeature,\n PdfEngineOperation,\n PdfSignatureObject,\n AnnotationCreateContext,\n Task,\n PdfErrorCode,\n SearchResult,\n CompoundTask,\n ImageDataLike,\n IPdfiumExecutor,\n AnnotationAppearanceMap,\n} from '@embedpdf/models';\nimport { WorkerTaskQueue, Priority } from './task-queue';\nimport type { ImageDataConverter } from '../converters/types';\n\n// Re-export for convenience\nexport type { ImageDataConverter } from '../converters/types';\nexport type { ImageDataLike, IPdfiumExecutor, BatchProgress } from '@embedpdf/models';\n\nconst LOG_SOURCE = 'PdfEngine';\nconst LOG_CATEGORY = 'Orchestrator';\n\nexport interface PdfEngineOptions<T> {\n /**\n * Image data converter (for encoding raw image data to Blob/other format)\n */\n imageConverter: ImageDataConverter<T>;\n /**\n * Fetch function for fetching remote URLs\n */\n fetcher?: typeof fetch;\n /**\n * Logger instance\n */\n logger?: Logger;\n}\n\n/**\n * PdfEngine orchestrator\n *\n * This is the \"smart\" layer that:\n * - Implements the PdfEngine interface\n * - Uses WorkerTaskQueue for priority-based task scheduling\n * - Orchestrates complex multi-page operations\n * - Handles image encoding with separate encoder pool\n * - Manages visibility-based task ranking\n */\nexport class PdfEngine<T = Blob> implements IPdfEngine<T> {\n private executor: IPdfiumExecutor;\n private workerQueue: WorkerTaskQueue;\n private logger: Logger;\n private options: PdfEngineOptions<T>;\n\n constructor(executor: IPdfiumExecutor, options: PdfEngineOptions<T>) {\n this.executor = executor;\n this.logger = options.logger ?? new NoopLogger();\n this.options = {\n imageConverter: options.imageConverter,\n fetcher:\n options.fetcher ??\n (typeof fetch !== 'undefined' ? (url, init) => fetch(url, init) : undefined),\n logger: this.logger,\n };\n\n // Create worker queue with single concurrency (PDFium is single-threaded)\n this.workerQueue = new WorkerTaskQueue({\n concurrency: 1,\n autoStart: true,\n logger: this.logger,\n });\n\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'PdfEngine orchestrator created');\n }\n\n /**\n * Split an array into chunks of a given size\n */\n private chunkArray<U>(items: U[], chunkSize: number): U[][] {\n const chunks: U[][] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n chunks.push(items.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n // ========== IPdfEngine Implementation ==========\n\n isSupport(feature: PdfEngineFeature): PdfTask<PdfEngineOperation[]> {\n const task = new Task<PdfEngineOperation[], PdfErrorReason>();\n // PDFium supports all features\n task.resolve([\n PdfEngineOperation.Create,\n PdfEngineOperation.Read,\n PdfEngineOperation.Update,\n PdfEngineOperation.Delete,\n ]);\n return task;\n }\n\n destroy(): PdfTask<boolean> {\n const task = new Task<boolean, PdfErrorReason>();\n try {\n this.executor.destroy();\n // Clean up image converter resources (e.g., encoder worker pool)\n this.options.imageConverter.destroy?.();\n task.resolve(true);\n } catch (error) {\n task.reject({ code: PdfErrorCode.Unknown, message: String(error) });\n }\n return task;\n }\n\n openDocumentUrl(\n file: PdfFileUrl,\n options?: PdfOpenDocumentUrlOptions,\n ): PdfTask<PdfDocumentObject> {\n const task = new Task<PdfDocumentObject, PdfErrorReason>();\n\n // Handle fetch in main thread (not worker!)\n (async () => {\n try {\n if (!this.options.fetcher) {\n throw new Error('Fetcher is not set');\n }\n\n const response = await this.options.fetcher(file.url, options?.requestOptions);\n const arrayBuf = await response.arrayBuffer();\n\n const pdfFile: PdfFile = {\n id: file.id,\n content: arrayBuf,\n };\n\n // Then open in worker - use wait() to properly propagate task errors\n this.openDocumentBuffer(pdfFile, {\n password: options?.password,\n normalizeRotation: options?.normalizeRotation,\n }).wait(\n (doc) => task.resolve(doc),\n (error) => task.fail(error),\n );\n } catch (error) {\n // This only catches fetch errors (network issues, etc.)\n task.reject({ code: PdfErrorCode.Unknown, message: String(error) });\n }\n })();\n\n return task;\n }\n\n openDocumentBuffer(\n file: PdfFile,\n options?: PdfOpenDocumentBufferOptions,\n ): PdfTask<PdfDocumentObject> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.openDocumentBuffer(file, options),\n meta: { docId: file.id, operation: 'openDocumentBuffer' },\n },\n { priority: Priority.CRITICAL },\n );\n }\n\n getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getMetadata(doc),\n meta: { docId: doc.id, operation: 'getMetadata' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.setMetadata(doc, metadata),\n meta: { docId: doc.id, operation: 'setMetadata' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getDocPermissions(doc: PdfDocumentObject): PdfTask<number> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getDocPermissions(doc),\n meta: { docId: doc.id, operation: 'getDocPermissions' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getDocUserPermissions(doc),\n meta: { docId: doc.id, operation: 'getDocUserPermissions' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getSignatures(doc),\n meta: { docId: doc.id, operation: 'getSignatures' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getBookmarks(doc),\n meta: { docId: doc.id, operation: 'getBookmarks' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.setBookmarks(doc, bookmarks),\n meta: { docId: doc.id, operation: 'setBookmarks' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.deleteBookmarks(doc),\n meta: { docId: doc.id, operation: 'deleteBookmarks' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n // ========== Rendering with Encoding ==========\n\n renderPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ): PdfTask<T> {\n return this.renderWithEncoding(\n () => this.executor.renderPageRaw(doc, page, options),\n options,\n doc.id,\n page.index,\n Priority.CRITICAL,\n );\n }\n\n renderPageRect(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<T> {\n return this.renderWithEncoding(\n () => this.executor.renderPageRect(doc, page, rect, options),\n options,\n doc.id,\n page.index,\n Priority.HIGH,\n );\n }\n\n // ========== Raw Rendering (no encoding) ==========\n\n renderPageRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.renderPageRaw(doc, page, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'renderPageRaw' },\n },\n { priority: Priority.HIGH },\n );\n }\n\n renderPageRectRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rect: Rect,\n options?: PdfRenderPageOptions,\n ): PdfTask<ImageDataLike> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.renderPageRect(doc, page, rect, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'renderPageRectRaw' },\n },\n { priority: Priority.HIGH },\n );\n }\n\n renderThumbnail(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderThumbnailOptions,\n ): PdfTask<T> {\n return this.renderWithEncoding(\n () => this.executor.renderThumbnailRaw(doc, page, options),\n options,\n doc.id,\n page.index,\n Priority.MEDIUM,\n );\n }\n\n renderPageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<T> {\n return this.renderWithEncoding(\n () => this.executor.renderPageAnnotationRaw(doc, page, annotation, options),\n options,\n doc.id,\n page.index,\n Priority.MEDIUM,\n );\n }\n\n renderPageAnnotations(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<AnnotationAppearanceMap<T>> {\n const resultTask = new Task<AnnotationAppearanceMap<T>, PdfErrorReason>();\n\n const renderHandle = this.workerQueue.enqueue(\n {\n execute: () => this.executor.renderPageAnnotationsRaw(doc, page, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'renderPageAnnotationsRaw' },\n },\n { priority: Priority.MEDIUM },\n );\n\n // Wire up abort: when resultTask is aborted, also abort the queue task\n const originalAbort = resultTask.abort.bind(resultTask);\n resultTask.abort = (reason) => {\n renderHandle.abort(reason);\n originalAbort(reason);\n };\n\n renderHandle.wait(\n (rawMap) => {\n if (resultTask.state.stage !== 0 /* Pending */) {\n return;\n }\n this.encodeAppearanceMap(rawMap, options, resultTask);\n },\n (error) => {\n if (resultTask.state.stage === 0 /* Pending */) {\n resultTask.fail(error);\n }\n },\n );\n\n return resultTask;\n }\n\n renderPageAnnotationsRaw(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfRenderPageAnnotationOptions,\n ): PdfTask<AnnotationAppearanceMap<ImageDataLike>> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.renderPageAnnotationsRaw(doc, page, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'renderPageAnnotationsRaw' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * Helper to render and encode in two stages with priority queue\n */\n private renderWithEncoding(\n renderFn: () => PdfTask<ImageDataLike>,\n options?: PdfRenderPageOptions | PdfRenderThumbnailOptions | PdfRenderPageAnnotationOptions,\n docId?: string,\n pageIndex?: number,\n priority: Priority = Priority.CRITICAL,\n ): PdfTask<T> {\n const resultTask = new Task<T, PdfErrorReason>();\n\n // Step 1: Add HIGH/MEDIUM priority task to render raw bytes\n const renderHandle = this.workerQueue.enqueue(\n {\n execute: () => renderFn(),\n meta: { docId, pageIndex, operation: 'render' },\n },\n { priority },\n );\n\n // Wire up abort: when resultTask is aborted, also abort the queue task\n const originalAbort = resultTask.abort.bind(resultTask);\n resultTask.abort = (reason) => {\n renderHandle.abort(reason); // Cancel the queue task!\n originalAbort(reason);\n };\n\n renderHandle.wait(\n (rawImageData) => {\n // Check if resultTask was already aborted before encoding\n if (resultTask.state.stage !== 0 /* Pending */) {\n return;\n }\n this.encodeImage(rawImageData, options, resultTask);\n },\n (error) => {\n // Only forward error if resultTask is still pending\n if (resultTask.state.stage === 0 /* Pending */) {\n resultTask.fail(error);\n }\n },\n );\n\n return resultTask;\n }\n\n /**\n * Encode image using encoder pool or inline\n */\n private encodeImage(\n rawImageData: ImageDataLike,\n options: any,\n resultTask: Task<T, PdfErrorReason>,\n ): void {\n const imageType = options?.imageType ?? 'image/png';\n const quality = options?.quality;\n\n // Convert to plain object for encoding\n const plainImageData = {\n data: new Uint8ClampedArray(rawImageData.data),\n width: rawImageData.width,\n height: rawImageData.height,\n };\n\n this.options\n .imageConverter(() => plainImageData, imageType, quality)\n .then((result) => resultTask.resolve(result))\n .catch((error) => resultTask.reject({ code: PdfErrorCode.Unknown, message: String(error) }));\n }\n\n /**\n * Encode a full annotation appearance map to the output type T.\n */\n private encodeAppearanceMap(\n rawMap: AnnotationAppearanceMap<ImageDataLike>,\n options: PdfRenderPageAnnotationOptions | undefined,\n resultTask: Task<AnnotationAppearanceMap<T>, PdfErrorReason>,\n ): void {\n const imageType = options?.imageType ?? 'image/png';\n const quality = options?.imageQuality;\n\n const convertImage = (rawImageData: ImageDataLike): Promise<T> => {\n const plainImageData = {\n data: new Uint8ClampedArray(rawImageData.data),\n width: rawImageData.width,\n height: rawImageData.height,\n };\n return this.options.imageConverter(() => plainImageData, imageType, quality);\n };\n\n const jobs: Promise<void>[] = [];\n const encodedMap: AnnotationAppearanceMap<T> = {};\n const modes: Array<'normal' | 'rollover' | 'down'> = ['normal', 'rollover', 'down'];\n\n for (const [annotationId, appearances] of Object.entries(rawMap)) {\n const encodedAppearances: NonNullable<AnnotationAppearanceMap<T>[string]> = {};\n encodedMap[annotationId] = encodedAppearances;\n\n for (const mode of modes) {\n const appearance = appearances[mode];\n if (!appearance) continue;\n\n jobs.push(\n convertImage(appearance.data).then((encodedData) => {\n encodedAppearances[mode] = {\n data: encodedData,\n rect: appearance.rect,\n };\n }),\n );\n }\n }\n\n Promise.all(jobs)\n .then(() => {\n if (resultTask.state.stage === 0 /* Pending */) {\n resultTask.resolve(encodedMap);\n }\n })\n .catch((error) => {\n if (resultTask.state.stage === 0 /* Pending */) {\n resultTask.reject({ code: PdfErrorCode.Unknown, message: String(error) });\n }\n });\n }\n\n // ========== Annotations ==========\n\n getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageAnnotations(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageAnnotations' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n createPageAnnotation<A extends PdfAnnotationObject>(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: A,\n context?: AnnotationCreateContext<A>,\n ): PdfTask<string> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.createPageAnnotation(doc, page, annotation, context),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'createPageAnnotation' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n updatePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n options?: { regenerateAppearance?: boolean },\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.updatePageAnnotation(doc, page, annotation, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'updatePageAnnotation' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n removePageAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.removePageAnnotation(doc, page, annotation),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'removePageAnnotation' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * Get all annotations across all pages\n * Uses batched operations to reduce queue overhead\n */\n getAllAnnotations(\n doc: PdfDocumentObject,\n ): CompoundTask<Record<number, PdfAnnotationObject[]>, PdfErrorReason, PdfAnnotationsProgress> {\n // Chunk pages for batched processing\n const chunks = this.chunkArray(doc.pages, 500);\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `getAllAnnotations: ${doc.pages.length} pages in ${chunks.length} chunks`,\n );\n\n // Create compound task for result aggregation\n const compound = new CompoundTask<\n Record<number, PdfAnnotationObject[]>,\n PdfErrorReason,\n PdfAnnotationsProgress\n >({\n aggregate: (results) => Object.assign({}, ...results),\n });\n\n // Create one task per chunk and wire up progress forwarding\n chunks.forEach((chunkPages, chunkIndex) => {\n const batchTask = this.workerQueue.enqueue(\n {\n execute: () => this.executor.getAnnotationsBatch(doc, chunkPages),\n meta: { docId: doc.id, operation: 'getAnnotationsBatch', chunkSize: chunkPages.length },\n },\n { priority: Priority.LOW },\n );\n\n // Forward batch progress (per-page) to compound task\n batchTask.onProgress((batchProgress: BatchProgress<PdfAnnotationObject[]>) => {\n compound.progress({\n page: batchProgress.pageIndex,\n result: batchProgress.result,\n });\n });\n\n compound.addChild(batchTask, chunkIndex);\n });\n\n compound.finalize();\n return compound;\n }\n\n getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageTextRects(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageTextRects' },\n },\n {\n priority: Priority.MEDIUM,\n },\n );\n }\n\n // ========== Search ==========\n\n /**\n * Search across all pages\n * Uses batched operations to reduce queue overhead\n */\n searchAllPages(\n doc: PdfDocumentObject,\n keyword: string,\n options?: PdfSearchAllPagesOptions,\n ): PdfTask<SearchAllPagesResult, PdfPageSearchProgress> {\n const flags = Array.isArray(options?.flags)\n ? options.flags.reduce((acc, flag) => acc | flag, 0)\n : (options?.flags ?? 0);\n\n // Chunk pages for batched processing\n const chunks = this.chunkArray(doc.pages, 25);\n\n this.logger.debug(\n LOG_SOURCE,\n LOG_CATEGORY,\n `searchAllPages: ${doc.pages.length} pages in ${chunks.length} chunks`,\n );\n\n // Create compound task for result aggregation\n const compound = new CompoundTask<SearchAllPagesResult, PdfErrorReason, PdfPageSearchProgress>({\n aggregate: (results) => {\n // Merge all batch results into a flat array\n const allResults = results.flatMap((batchResult: Record<number, SearchResult[]>) =>\n Object.values(batchResult).flat(),\n );\n return { results: allResults, total: allResults.length };\n },\n });\n\n // Create one task per chunk and wire up progress forwarding\n chunks.forEach((chunkPages, chunkIndex) => {\n const batchTask = this.workerQueue.enqueue(\n {\n execute: () => this.executor.searchBatch(doc, chunkPages, keyword, flags),\n meta: { docId: doc.id, operation: 'searchBatch', chunkSize: chunkPages.length },\n },\n { priority: Priority.LOW },\n );\n\n // Forward batch progress (per-page) to compound task\n batchTask.onProgress((batchProgress: BatchProgress<SearchResult[]>) => {\n compound.progress({\n page: batchProgress.pageIndex,\n results: batchProgress.result,\n });\n });\n\n compound.addChild(batchTask, chunkIndex);\n });\n\n compound.finalize();\n return compound;\n }\n\n // ========== Attachments ==========\n\n getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getAttachments(doc),\n meta: { docId: doc.id, operation: 'getAttachments' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.addAttachment(doc, params),\n meta: { docId: doc.id, operation: 'addAttachment' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.removeAttachment(doc, attachment),\n meta: { docId: doc.id, operation: 'removeAttachment' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n readAttachmentContent(\n doc: PdfDocumentObject,\n attachment: PdfAttachmentObject,\n ): PdfTask<ArrayBuffer> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.readAttachmentContent(doc, attachment),\n meta: { docId: doc.id, operation: 'readAttachmentContent' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n // ========== Forms ==========\n\n getDocumentJavaScriptActions(\n doc: PdfDocumentObject,\n ): PdfTask<PdfDocumentJavaScriptActionObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getDocumentJavaScriptActions(doc),\n meta: { docId: doc.id, operation: 'getDocumentJavaScriptActions' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getPageAnnoWidgets(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfWidgetAnnoObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageAnnoWidgets(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageAnnoWidgets' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getPageWidgetJavaScriptActions(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n ): PdfTask<PdfWidgetJavaScriptActionObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageWidgetJavaScriptActions(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageWidgetJavaScriptActions' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n setFormFieldValue(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n value: FormFieldValue,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.setFormFieldValue(doc, page, annotation, value),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'setFormFieldValue' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n setFormFieldState(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n field: PdfWidgetAnnoField,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.setFormFieldState(doc, page, annotation, field),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'setFormFieldState' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n renameWidgetField(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfWidgetAnnoObject,\n name: string,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.renameWidgetField(doc, page, annotation, name),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'renameWidgetField' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n shareWidgetField(\n doc: PdfDocumentObject,\n sourcePage: PdfPageObject,\n sourceAnnotation: PdfWidgetAnnoObject,\n targetPage: PdfPageObject,\n targetAnnotation: PdfWidgetAnnoObject,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () =>\n this.executor.shareWidgetField(\n doc,\n sourcePage,\n sourceAnnotation,\n targetPage,\n targetAnnotation,\n ),\n meta: {\n docId: doc.id,\n pageIndex: sourcePage.index,\n operation: 'shareWidgetField',\n },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n regenerateWidgetAppearances(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotationIds: string[],\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.regenerateWidgetAppearances(doc, page, annotationIds),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'regenerateWidgetAppearances' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n flattenPage(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n options?: PdfFlattenPageOptions,\n ): PdfTask<PdfPageFlattenResult> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.flattenPage(doc, page, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'flattenPage' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n // ========== Text Operations ==========\n\n extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.extractPages(doc, pageIndexes),\n meta: { docId: doc.id, pageIndexes: pageIndexes, operation: 'extractPages' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n createDocument(id: string): PdfTask<PdfDocumentObject> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.createDocument(id),\n meta: { docId: id, operation: 'createDocument' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n importPages(\n destDoc: PdfDocumentObject,\n srcDoc: PdfDocumentObject,\n srcPageIndices: number[],\n insertIndex?: number,\n ): PdfTask<PdfPageObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.importPages(destDoc, srcDoc, srcPageIndices, insertIndex),\n meta: { docId: destDoc.id, operation: 'importPages' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n deletePage(doc: PdfDocumentObject, pageIndex: number): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.deletePage(doc, pageIndex),\n meta: { docId: doc.id, operation: 'deletePage' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.extractText(doc, pageIndexes),\n meta: { docId: doc.id, pageIndexes: pageIndexes, operation: 'extractText' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n redactTextInRects(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n rects: Rect[],\n options?: PdfRedactTextOptions,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.redactTextInRects(doc, page, rects, options),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'redactTextInRects' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n applyRedaction(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.applyRedaction(doc, page, annotation),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'applyRedaction' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n applyAllRedactions(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.applyAllRedactions(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'applyAllRedactions' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n flattenAnnotation(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.flattenAnnotation(doc, page, annotation),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'flattenAnnotation' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n exportAnnotationAppearanceAsPdf(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotation: PdfAnnotationObject,\n ): PdfTask<ArrayBuffer> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.exportAnnotationAppearanceAsPdf(doc, page, annotation),\n meta: {\n docId: doc.id,\n pageIndex: page.index,\n operation: 'exportAnnotationAppearanceAsPdf',\n },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n exportAnnotationsAppearanceAsPdf(\n doc: PdfDocumentObject,\n page: PdfPageObject,\n annotations: PdfAnnotationObject[],\n ): PdfTask<ArrayBuffer> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.exportAnnotationsAppearanceAsPdf(doc, page, annotations),\n meta: {\n docId: doc.id,\n pageIndex: page.index,\n operation: 'exportAnnotationsAppearanceAsPdf',\n },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getTextSlices(doc, slices),\n meta: { docId: doc.id, slices: slices, operation: 'getTextSlices' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageGlyphs(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageGlyphs' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageGeometry(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageGeometry' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n getPageTextRuns(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageTextRuns> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.getPageTextRuns(doc, page),\n meta: { docId: doc.id, pageIndex: page.index, operation: 'getPageTextRuns' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n // ========== Document Operations ==========\n\n merge(files: PdfFile[]): PdfTask<PdfFile> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.merge(files),\n meta: { docId: files.map((file) => file.id).join(','), operation: 'merge' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>): PdfTask<PdfFile> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.mergePages(mergeConfigs),\n meta: {\n docId: mergeConfigs.map((config) => config.docId).join(','),\n operation: 'mergePages',\n },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.preparePrintDocument(doc, options),\n meta: { docId: doc.id, operation: 'preparePrintDocument' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.saveAsCopy(doc),\n meta: { docId: doc.id, operation: 'saveAsCopy' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n closeDocument(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.closeDocument(doc),\n meta: { docId: doc.id, operation: 'closeDocument' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n closeAllDocuments(): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.closeAllDocuments(),\n meta: { operation: 'closeAllDocuments' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.setDocumentEncryption}\n */\n setDocumentEncryption(\n doc: PdfDocumentObject,\n userPassword: string,\n ownerPassword: string,\n allowedFlags: number,\n ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () =>\n this.executor.setDocumentEncryption(doc, userPassword, ownerPassword, allowedFlags),\n meta: { docId: doc.id, operation: 'setDocumentEncryption' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.removeEncryption}\n */\n removeEncryption(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.removeEncryption(doc),\n meta: { docId: doc.id, operation: 'removeEncryption' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.unlockOwnerPermissions}\n */\n unlockOwnerPermissions(doc: PdfDocumentObject, ownerPassword: string): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.unlockOwnerPermissions(doc, ownerPassword),\n meta: { docId: doc.id, operation: 'unlockOwnerPermissions' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.isEncrypted}\n */\n isEncrypted(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.isEncrypted(doc),\n meta: { docId: doc.id, operation: 'isEncrypted' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n\n /**\n * {@inheritDoc @embedpdf/models!PdfEngine.isOwnerUnlocked}\n */\n isOwnerUnlocked(doc: PdfDocumentObject): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.isOwnerUnlocked(doc),\n meta: { docId: doc.id, operation: 'isOwnerUnlocked' },\n },\n { priority: Priority.MEDIUM },\n );\n }\n}\n"],"names":["LOG_SOURCE","LOG_CATEGORY","Priority"],"mappings":";AAEA,MAAMA,eAAa;AACnB,MAAMC,iBAAe;AAEd,IAAK,6BAAAC,cAAL;AACLA,YAAAA,UAAA,cAAW,CAAA,IAAX;AACAA,YAAAA,UAAA,UAAO,CAAA,IAAP;AACAA,YAAAA,UAAA,YAAS,CAAA,IAAT;AACAA,YAAAA,UAAA,SAAM,CAAA,IAAN;AAJU,SAAAA;AAAA,GAAA,YAAA,CAAA,CAAA;AA6DL,MAAM,gBAAgB;AAAA,EAU3B,YAAY,UAAkC,IAAI;AATlD,SAAQ,QAA2B,CAAA;AACnC,SAAQ,UAAU;AAClB,SAAQ,kCAAkB,IAAA;AA6D1B,SAAQ,oCAAoB,IAAA;AArD1B,UAAM;AAAA,MACJ,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IAAA,IACE;AACJ,SAAK,SAAS,UAAU,IAAI,WAAA;AAC5B,SAAK,OAAO;AAAA,MACV,aAAa,KAAK,IAAI,GAAG,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,MAAM;AAAA,MAAC;AAAA,MAC1B,cAAc,gBAAgB,OAAO;AAAA,MACrC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,cAAc,YAAmC;AAC/C,SAAK,KAAK,aAAa;AAAA,EACzB;AAAA,EAEA,UAAU,QAA2B;AACnC,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAkB;AAChB,WAAO,KAAK,MAAM,WAAW,KAAK,KAAK,YAAY;AAAA,EACrD;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,SAAU;AACnB,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,YAAM,QAAQ,MAAM;AAClB,YAAI,KAAK,UAAU;AACjB,eAAK,QAAQ,KAAK;AAClB,kBAAA;AAAA,QACF;AAAA,MACF;AACA,WAAK,OAAO,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAGQ,aAAa;AACnB,QAAI,KAAK,UAAU;AACjB,OAAC,GAAG,KAAK,aAAa,EAAE,QAAQ,CAAC,OAAO,IAAI;AAC5C,WAAK,cAAc,MAAA;AACnB,WAAK,KAAK,OAAA;AAAA,IACZ;AAAA,EACF;AAAA,EACQ,OAAO,IAAgB;AAC7B,SAAK,cAAc,IAAI,EAAE;AAAA,EAC3B;AAAA,EACQ,QAAQ,IAAgB;AAC9B,SAAK,cAAc,OAAO,EAAE;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,QACE,SAIA,UAA0B,IACvB;AACH,UAAM,KAAK,KAAK,WAAA;AAChB,UAAM,WAAW,QAAQ,YAAY;AAIrC,UAAM,aAAa,IAAI,KAAA;AAMvB,QAAI,KAAK,MAAM,UAAU,KAAK,KAAK,cAAc;AAC/C,YAAM,QAAQ,IAAI,MAAM,uCAAuC;AAC/D,iBAAW,OAAO,KAAY;AAC9B,aAAO;AAAA,IACT;AAGA,SAAK,YAAY,IAAI,IAAI,UAAU;AAEnC,UAAM,aAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MAC9B,gBAAgB,QAAQ;AAAA;AAAA,IAAA;AAG1B,SAAK,MAAM,KAAK,UAAU;AAE1B,SAAK,OAAO;AAAA,MACVF;AAAAA,MACAC;AAAAA,MACA,kBAAkB,EAAE,gBAAgB,QAAQ,eAAe,KAAK,OAAO,cAAc,KAAK,MAAM,MAAM;AAAA,IAAA;AAKxG,UAAM,gBAAgB,WAAW,MAAM,KAAK,UAAU;AACtD,eAAW,QAAQ,CAAC,WAAgB;AAClC,WAAK,OAAO,MAAMD,cAAYC,gBAAc,iBAAiB,EAAE,EAAE;AACjE,WAAK,OAAO,EAAE;AACd,oBAAc,MAAM;AAAA,IACtB;AAEA,QAAI,KAAK,KAAK,gBAAgB,QAAQ,QAAQ,SAAS,IAAI;AAE3D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,QAAsB;AACnC,UAAM,SAAS,KAAK,MAAM;AAC1B,SAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,MAAM;AACpC,UAAI,EAAE,OAAO,QAAQ;AACnB,UAAE,YAAY;AACd,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAED,SAAK,YAAY,OAAO,MAAM;AAE9B,QAAI,WAAW,KAAK,MAAM,QAAQ;AAChC,WAAK,OAAO,MAAMD,cAAYC,gBAAc,+BAA+B,MAAM,EAAE;AACnF,WAAK,KAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,OAAO;AACb,mBAAe,MAAM,KAAK,SAAS;AAAA,EACrC;AAAA,EAEA,MAAc,QAAQ,OAAO,OAAsB;AACjD,SAAK,OAAO;AAAA,MACVD;AAAAA,MACAC;AAAAA,MACA,+BAA+B,KAAK,OAAO,mBAAmB,KAAK,KAAK,WAAW,cAAc,KAAK,MAAM,MAAM;AAAA,IAAA;AAGpH,WAAO,KAAK,UAAU,KAAK,KAAK,eAAe,KAAK,MAAM,SAAS,GAAG;AACpE,WAAK,OAAO;AAAA,QACVD;AAAAA,QACAC;AAAAA,QACA,gCAAgC,KAAK,OAAO,cAAc,KAAK,MAAM,MAAM;AAAA,MAAA;AAG7E,UAAI,CAAC,KAAM,MAAK,UAAA;AAEhB,YAAM,aAAa,KAAK,MAAM,MAAA;AAC9B,UAAI,WAAW,WAAW;AACxB,aAAK,OAAO,MAAMD,cAAYC,gBAAc,4BAA4B,WAAW,EAAE,EAAE;AACvF;AAAA,MACF;AAEA,YAAM,aAAa,KAAK,YAAY,IAAI,WAAW,EAAE;AACrD,UAAI,CAAC,WAAY;AAEjB,WAAK;AAGL,OAAC,YAAY;AACX,YAAI,WAAuC;AAE3C,YAAI;AAEF,qBAAW,WAAW,eAAA;AAGtB,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,sCAAsC;AAAA,UACxD;AAGA,mBAAS;AAAA,YACP,CAAC,WAAW;AACV,kBAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,2BAAW,QAAQ,MAAM;AAAA,cAC3B;AAAA,YACF;AAAA,YACA,CAAC,UAAU;AACT,kBAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,oBAAI,MAAM,SAAS,SAAS;AAC1B,6BAAW,MAAM,MAAM,MAAM;AAAA,gBAC/B,OAAO;AACL,6BAAW,OAAO,MAAM,MAAM;AAAA,gBAChC;AAAA,cACF;AAAA,YACF;AAAA,UAAA;AAIF,mBAAS,WAAW,CAAC,aAAa;AAChC,uBAAW,SAAS,QAAQ;AAAA,UAC9B,CAAC;AAGD,gBAAM,SAAS,UAAA;AAAA,QACjB,SAAS,OAAO;AAEd,cAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,uBAAW,OAAO,KAAY;AAAA,UAChC;AAAA,QACF,UAAA;AACE,eAAK,YAAY,OAAO,WAAW,EAAE;AACrC,eAAK;AAEL,eAAK,OAAO;AAAA,YACVD;AAAAA,YACAC;AAAAA,YACA,mBAAmB,WAAW,EAAE,eAAe,KAAK,OAAO,cAAc,KAAK,MAAM,MAAM;AAAA,UAAA;AAG5F,cAAI,KAAK,UAAU;AACjB,iBAAK,WAAA;AAAA,UACP,WAAW,KAAK,MAAM,SAAS,GAAG;AAChC,iBAAK,KAAA;AAAA,UACP;AAAA,QACF;AAAA,MACF,GAAA,EAAK,MAAM,CAAC,UAAU;AACpB,aAAK,OAAO;AAAA,UACVD;AAAAA,UACAC;AAAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,aAAK,UAAU,KAAK,IAAI,GAAG,KAAK,UAAU,CAAC;AAC3C,YAAI,KAAK,UAAU;AACjB,eAAK,WAAA;AAAA,QACP,WAAW,KAAK,MAAM,SAAS,GAAG;AAChC,eAAK,KAAA;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,UAAM,EAAE,YAAY,OAAA,IAAW,KAAK;AACpC,QAAI,YAAY;AACd,WAAK,MAAM,KAAK,UAAU;AAC1B;AAAA,IACF;AAEA,UAAM,gCAAgB,IAAA;AACtB,UAAM,UAAU,CAAC,MAAuB;AACtC,UAAI,CAAC,OAAQ,QAAO,KAAK,YAAY,CAAC;AACtC,UAAI,CAAC,UAAU,IAAI,EAAE,EAAE,EAAG,WAAU,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC;AACvD,aAAO,UAAU,IAAI,EAAE,EAAE;AAAA,IAC3B;AAEA,SAAK,MAAM,KAAK,CAAC,GAAG,MAAM;AACxB,UAAI,EAAE,aAAa,EAAE,SAAU,QAAO,EAAE,WAAW,EAAE;AACrD,YAAM,KAAK,QAAQ,CAAC;AACpB,YAAM,KAAK,QAAQ,CAAC;AACpB,UAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,aAAO,KAAK,YAAY,EAAE,EAAE,IAAI,KAAK,YAAY,EAAE,EAAE;AAAA,IACvD,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,OAAgC;AAClD,WAAO;AAAA,EACT;AAAA,EAEQ,aAAqB;AAC3B,QAAI,OAAO,WAAW,eAAe,gBAAgB,QAAQ;AAC3D,aAAO,OAAO,WAAA;AAAA,IAChB;AACA,WAAO,GAAG,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,EAC7D;AAAA,EAEQ,YAAY,IAAoB;AACtC,UAAM,IAAI,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;AACjC,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACF;AChUA,MAAM,aAAa;AACnB,MAAM,eAAe;AA2Bd,MAAM,UAA6C;AAAA,EAMxD,YAAY,UAA2B,SAA8B;AACnE,SAAK,WAAW;AAChB,SAAK,SAAS,QAAQ,UAAU,IAAI,WAAA;AACpC,SAAK,UAAU;AAAA,MACb,gBAAgB,QAAQ;AAAA,MACxB,SACE,QAAQ,YACP,OAAO,UAAU,cAAc,CAAC,KAAK,SAAS,MAAM,KAAK,IAAI,IAAI;AAAA,MACpE,QAAQ,KAAK;AAAA,IAAA;AAIf,SAAK,cAAc,IAAI,gBAAgB;AAAA,MACrC,aAAa;AAAA,MACb,WAAW;AAAA,MACX,QAAQ,KAAK;AAAA,IAAA,CACd;AAED,SAAK,OAAO,MAAM,YAAY,cAAc,gCAAgC;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAc,OAAY,WAA0B;AAC1D,UAAM,SAAgB,CAAA;AACtB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,WAAW;AAChD,aAAO,KAAK,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,UAAU,SAA0D;AAClE,UAAM,OAAO,IAAI,KAAA;AAEjB,SAAK,QAAQ;AAAA,MACX,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,IAAA,CACpB;AACD,WAAO;AAAA,EACT;AAAA,EAEA,UAA4B;;AAC1B,UAAM,OAAO,IAAI,KAAA;AACjB,QAAI;AACF,WAAK,SAAS,QAAA;AAEd,uBAAK,QAAQ,gBAAe,YAA5B;AACA,WAAK,QAAQ,IAAI;AAAA,IACnB,SAAS,OAAO;AACd,WAAK,OAAO,EAAE,MAAM,aAAa,SAAS,SAAS,OAAO,KAAK,GAAG;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBACE,MACA,SAC4B;AAC5B,UAAM,OAAO,IAAI,KAAA;AAGjB,KAAC,YAAY;AACX,UAAI;AACF,YAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,gBAAM,IAAI,MAAM,oBAAoB;AAAA,QACtC;AAEA,cAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,KAAK,KAAK,mCAAS,cAAc;AAC7E,cAAM,WAAW,MAAM,SAAS,YAAA;AAEhC,cAAM,UAAmB;AAAA,UACvB,IAAI,KAAK;AAAA,UACT,SAAS;AAAA,QAAA;AAIX,aAAK,mBAAmB,SAAS;AAAA,UAC/B,UAAU,mCAAS;AAAA,UACnB,mBAAmB,mCAAS;AAAA,QAAA,CAC7B,EAAE;AAAA,UACD,CAAC,QAAQ,KAAK,QAAQ,GAAG;AAAA,UACzB,CAAC,UAAU,KAAK,KAAK,KAAK;AAAA,QAAA;AAAA,MAE9B,SAAS,OAAO;AAEd,aAAK,OAAO,EAAE,MAAM,aAAa,SAAS,SAAS,OAAO,KAAK,GAAG;AAAA,MACpE;AAAA,IACF,GAAA;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,mBACE,MACA,SAC4B;AAC5B,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,mBAAmB,MAAM,OAAO;AAAA,QAC7D,MAAM,EAAE,OAAO,KAAK,IAAI,WAAW,qBAAA;AAAA,MAAqB;AAAA,MAE1D,EAAE,UAAU,SAAS,SAAA;AAAA,IAAS;AAAA,EAElC;AAAA,EAEA,YAAY,KAAoD;AAC9D,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,YAAY,GAAG;AAAA,QAC5C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,cAAA;AAAA,MAAc;AAAA,MAElD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,YAAY,KAAwB,UAAwD;AAC1F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,YAAY,KAAK,QAAQ;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,cAAA;AAAA,MAAc;AAAA,MAElD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,kBAAkB,KAAyC;AACzD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAkB,GAAG;AAAA,QAClD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAExD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,sBAAsB,KAAyC;AAC7D,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,sBAAsB,GAAG;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,wBAAA;AAAA,MAAwB;AAAA,MAE5D,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,cAAc,KAAuD;AACnE,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,cAAc,GAAG;AAAA,QAC9C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,gBAAA;AAAA,MAAgB;AAAA,MAEpD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,aAAa,KAAqD;AAChE,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,aAAa,GAAG;AAAA,QAC7C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,eAAA;AAAA,MAAe;AAAA,MAEnD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,aAAa,KAAwB,WAAkD;AACrF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,aAAa,KAAK,SAAS;AAAA,QACxD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,eAAA;AAAA,MAAe;AAAA,MAEnD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,gBAAgB,KAA0C;AACxD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,gBAAgB,GAAG;AAAA,QAChD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,kBAAA;AAAA,MAAkB;AAAA,MAEtD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA,EAIA,WACE,KACA,MACA,SACY;AACZ,WAAO,KAAK;AAAA,MACV,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM,OAAO;AAAA,MACpD;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,eACE,KACA,MACA,MACA,SACY;AACZ,WAAO,KAAK;AAAA,MACV,MAAM,KAAK,SAAS,eAAe,KAAK,MAAM,MAAM,OAAO;AAAA,MAC3D;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA,EAIA,cACE,KACA,MACA,SACwB;AACxB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM,OAAO;AAAA,QAC7D,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,gBAAA;AAAA,MAAgB;AAAA,MAE3E,EAAE,UAAU,SAAS,KAAA;AAAA,IAAK;AAAA,EAE9B;AAAA,EAEA,kBACE,KACA,MACA,MACA,SACwB;AACxB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,eAAe,KAAK,MAAM,MAAM,OAAO;AAAA,QACpE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAE/E,EAAE,UAAU,SAAS,KAAA;AAAA,IAAK;AAAA,EAE9B;AAAA,EAEA,gBACE,KACA,MACA,SACY;AACZ,WAAO,KAAK;AAAA,MACV,MAAM,KAAK,SAAS,mBAAmB,KAAK,MAAM,OAAO;AAAA,MACzD;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,qBACE,KACA,MACA,YACA,SACY;AACZ,WAAO,KAAK;AAAA,MACV,MAAM,KAAK,SAAS,wBAAwB,KAAK,MAAM,YAAY,OAAO;AAAA,MAC1E;AAAA,MACA,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,sBACE,KACA,MACA,SACqC;AACrC,UAAM,aAAa,IAAI,KAAA;AAEvB,UAAM,eAAe,KAAK,YAAY;AAAA,MACpC;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,yBAAyB,KAAK,MAAM,OAAO;AAAA,QACxE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,2BAAA;AAAA,MAA2B;AAAA,MAEtF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAI9B,UAAM,gBAAgB,WAAW,MAAM,KAAK,UAAU;AACtD,eAAW,QAAQ,CAAC,WAAW;AAC7B,mBAAa,MAAM,MAAM;AACzB,oBAAc,MAAM;AAAA,IACtB;AAEA,iBAAa;AAAA,MACX,CAAC,WAAW;AACV,YAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C;AAAA,QACF;AACA,aAAK,oBAAoB,QAAQ,SAAS,UAAU;AAAA,MACtD;AAAA,MACA,CAAC,UAAU;AACT,YAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,qBAAW,KAAK,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IAAA;AAGF,WAAO;AAAA,EACT;AAAA,EAEA,yBACE,KACA,MACA,SACiD;AACjD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,yBAAyB,KAAK,MAAM,OAAO;AAAA,QACxE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,2BAAA;AAAA,MAA2B;AAAA,MAEtF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBACN,UACA,SACA,OACA,WACA,WAAqB,SAAS,UAClB;AACZ,UAAM,aAAa,IAAI,KAAA;AAGvB,UAAM,eAAe,KAAK,YAAY;AAAA,MACpC;AAAA,QACE,SAAS,MAAM,SAAA;AAAA,QACf,MAAM,EAAE,OAAO,WAAW,WAAW,SAAA;AAAA,MAAS;AAAA,MAEhD,EAAE,SAAA;AAAA,IAAS;AAIb,UAAM,gBAAgB,WAAW,MAAM,KAAK,UAAU;AACtD,eAAW,QAAQ,CAAC,WAAW;AAC7B,mBAAa,MAAM,MAAM;AACzB,oBAAc,MAAM;AAAA,IACtB;AAEA,iBAAa;AAAA,MACX,CAAC,iBAAiB;AAEhB,YAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C;AAAA,QACF;AACA,aAAK,YAAY,cAAc,SAAS,UAAU;AAAA,MACpD;AAAA,MACA,CAAC,UAAU;AAET,YAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,qBAAW,KAAK,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IAAA;AAGF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YACN,cACA,SACA,YACM;AACN,UAAM,aAAY,mCAAS,cAAa;AACxC,UAAM,UAAU,mCAAS;AAGzB,UAAM,iBAAiB;AAAA,MACrB,MAAM,IAAI,kBAAkB,aAAa,IAAI;AAAA,MAC7C,OAAO,aAAa;AAAA,MACpB,QAAQ,aAAa;AAAA,IAAA;AAGvB,SAAK,QACF,eAAe,MAAM,gBAAgB,WAAW,OAAO,EACvD,KAAK,CAAC,WAAW,WAAW,QAAQ,MAAM,CAAC,EAC3C,MAAM,CAAC,UAAU,WAAW,OAAO,EAAE,MAAM,aAAa,SAAS,SAAS,OAAO,KAAK,EAAA,CAAG,CAAC;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,QACA,SACA,YACM;AACN,UAAM,aAAY,mCAAS,cAAa;AACxC,UAAM,UAAU,mCAAS;AAEzB,UAAM,eAAe,CAAC,iBAA4C;AAChE,YAAM,iBAAiB;AAAA,QACrB,MAAM,IAAI,kBAAkB,aAAa,IAAI;AAAA,QAC7C,OAAO,aAAa;AAAA,QACpB,QAAQ,aAAa;AAAA,MAAA;AAEvB,aAAO,KAAK,QAAQ,eAAe,MAAM,gBAAgB,WAAW,OAAO;AAAA,IAC7E;AAEA,UAAM,OAAwB,CAAA;AAC9B,UAAM,aAAyC,CAAA;AAC/C,UAAM,QAA+C,CAAC,UAAU,YAAY,MAAM;AAElF,eAAW,CAAC,cAAc,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AAChE,YAAM,qBAAsE,CAAA;AAC5E,iBAAW,YAAY,IAAI;AAE3B,iBAAW,QAAQ,OAAO;AACxB,cAAM,aAAa,YAAY,IAAI;AACnC,YAAI,CAAC,WAAY;AAEjB,aAAK;AAAA,UACH,aAAa,WAAW,IAAI,EAAE,KAAK,CAAC,gBAAgB;AAClD,+BAAmB,IAAI,IAAI;AAAA,cACzB,MAAM;AAAA,cACN,MAAM,WAAW;AAAA,YAAA;AAAA,UAErB,CAAC;AAAA,QAAA;AAAA,MAEL;AAAA,IACF;AAEA,YAAQ,IAAI,IAAI,EACb,KAAK,MAAM;AACV,UAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,mBAAW,QAAQ,UAAU;AAAA,MAC/B;AAAA,IACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,WAAW,MAAM,UAAU,GAAiB;AAC9C,mBAAW,OAAO,EAAE,MAAM,aAAa,SAAS,SAAS,OAAO,KAAK,GAAG;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA,EAIA,mBAAmB,KAAwB,MAAqD;AAC9F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,mBAAmB,KAAK,IAAI;AAAA,QACzD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,qBAAA;AAAA,MAAqB;AAAA,MAEhF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,qBACE,KACA,MACA,YACA,SACiB;AACjB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,qBAAqB,KAAK,MAAM,YAAY,OAAO;AAAA,QAChF,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,uBAAA;AAAA,MAAuB;AAAA,MAElF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,qBACE,KACA,MACA,YACA,SACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,qBAAqB,KAAK,MAAM,YAAY,OAAO;AAAA,QAChF,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,uBAAA;AAAA,MAAuB;AAAA,MAElF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,qBACE,KACA,MACA,YACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,qBAAqB,KAAK,MAAM,UAAU;AAAA,QACvE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,uBAAA;AAAA,MAAuB;AAAA,MAElF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBACE,KAC6F;AAE7F,UAAM,SAAS,KAAK,WAAW,IAAI,OAAO,GAAG;AAE7C,SAAK,OAAO;AAAA,MACV;AAAA,MACA;AAAA,MACA,sBAAsB,IAAI,MAAM,MAAM,aAAa,OAAO,MAAM;AAAA,IAAA;AAIlE,UAAM,WAAW,IAAI,aAInB;AAAA,MACA,WAAW,CAAC,YAAY,OAAO,OAAO,CAAA,GAAI,GAAG,OAAO;AAAA,IAAA,CACrD;AAGD,WAAO,QAAQ,CAAC,YAAY,eAAe;AACzC,YAAM,YAAY,KAAK,YAAY;AAAA,QACjC;AAAA,UACE,SAAS,MAAM,KAAK,SAAS,oBAAoB,KAAK,UAAU;AAAA,UAChE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,uBAAuB,WAAW,WAAW,OAAA;AAAA,QAAO;AAAA,QAExF,EAAE,UAAU,SAAS,IAAA;AAAA,MAAI;AAI3B,gBAAU,WAAW,CAAC,kBAAwD;AAC5E,iBAAS,SAAS;AAAA,UAChB,MAAM,cAAc;AAAA,UACpB,QAAQ,cAAc;AAAA,QAAA,CACvB;AAAA,MACH,CAAC;AAED,eAAS,SAAS,WAAW,UAAU;AAAA,IACzC,CAAC;AAED,aAAS,SAAA;AACT,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,KAAwB,MAAmD;AAC1F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,iBAAiB,KAAK,IAAI;AAAA,QACvD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,mBAAA;AAAA,MAAmB;AAAA,MAE9E;AAAA,QACE,UAAU,SAAS;AAAA,MAAA;AAAA,IACrB;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eACE,KACA,SACA,SACsD;AACtD,UAAM,QAAQ,MAAM,QAAQ,mCAAS,KAAK,IACtC,QAAQ,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,MAAM,CAAC,KAChD,mCAAS,UAAS;AAGvB,UAAM,SAAS,KAAK,WAAW,IAAI,OAAO,EAAE;AAE5C,SAAK,OAAO;AAAA,MACV;AAAA,MACA;AAAA,MACA,mBAAmB,IAAI,MAAM,MAAM,aAAa,OAAO,MAAM;AAAA,IAAA;AAI/D,UAAM,WAAW,IAAI,aAA0E;AAAA,MAC7F,WAAW,CAAC,YAAY;AAEtB,cAAM,aAAa,QAAQ;AAAA,UAAQ,CAAC,gBAClC,OAAO,OAAO,WAAW,EAAE,KAAA;AAAA,QAAK;AAElC,eAAO,EAAE,SAAS,YAAY,OAAO,WAAW,OAAA;AAAA,MAClD;AAAA,IAAA,CACD;AAGD,WAAO,QAAQ,CAAC,YAAY,eAAe;AACzC,YAAM,YAAY,KAAK,YAAY;AAAA,QACjC;AAAA,UACE,SAAS,MAAM,KAAK,SAAS,YAAY,KAAK,YAAY,SAAS,KAAK;AAAA,UACxE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,eAAe,WAAW,WAAW,OAAA;AAAA,QAAO;AAAA,QAEhF,EAAE,UAAU,SAAS,IAAA;AAAA,MAAI;AAI3B,gBAAU,WAAW,CAAC,kBAAiD;AACrE,iBAAS,SAAS;AAAA,UAChB,MAAM,cAAc;AAAA,UACpB,SAAS,cAAc;AAAA,QAAA,CACxB;AAAA,MACH,CAAC;AAED,eAAS,SAAS,WAAW,UAAU;AAAA,IACzC,CAAC;AAED,aAAS,SAAA;AACT,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,eAAe,KAAwD;AACrE,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,eAAe,GAAG;AAAA,QAC/C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,iBAAA;AAAA,MAAiB;AAAA,MAErD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,cAAc,KAAwB,QAAkD;AACtF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,gBAAA;AAAA,MAAgB;AAAA,MAEpD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,iBAAiB,KAAwB,YAAmD;AAC1F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,iBAAiB,KAAK,UAAU;AAAA,QAC7D,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,mBAAA;AAAA,MAAmB;AAAA,MAEvD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,sBACE,KACA,YACsB;AACtB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,sBAAsB,KAAK,UAAU;AAAA,QAClE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,wBAAA;AAAA,MAAwB;AAAA,MAE5D,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA,EAIA,6BACE,KAC8C;AAC9C,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,6BAA6B,GAAG;AAAA,QAC7D,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,+BAAA;AAAA,MAA+B;AAAA,MAEnE,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,mBAAmB,KAAwB,MAAqD;AAC9F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,mBAAmB,KAAK,IAAI;AAAA,QACzD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,qBAAA;AAAA,MAAqB;AAAA,MAEhF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,+BACE,KACA,MAC4C;AAC5C,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,+BAA+B,KAAK,IAAI;AAAA,QACrE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,iCAAA;AAAA,MAAiC;AAAA,MAE5F,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,kBACE,KACA,MACA,YACA,OACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAkB,KAAK,MAAM,YAAY,KAAK;AAAA,QAC3E,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAE/E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,kBACE,KACA,MACA,YACA,OACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAkB,KAAK,MAAM,YAAY,KAAK;AAAA,QAC3E,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAE/E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,kBACE,KACA,MACA,YACA,MACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAkB,KAAK,MAAM,YAAY,IAAI;AAAA,QAC1E,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAE/E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,iBACE,KACA,YACA,kBACA,YACA,kBACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MACP,KAAK,SAAS;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEJ,MAAM;AAAA,UACJ,OAAO,IAAI;AAAA,UACX,WAAW,WAAW;AAAA,UACtB,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,MAEF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,4BACE,KACA,MACA,eACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,4BAA4B,KAAK,MAAM,aAAa;AAAA,QACjF,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,8BAAA;AAAA,MAA8B;AAAA,MAEzF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,YACE,KACA,MACA,SAC+B;AAC/B,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,YAAY,KAAK,MAAM,OAAO;AAAA,QAC3D,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,cAAA;AAAA,MAAc;AAAA,MAEzE,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA,EAIA,aAAa,KAAwB,aAA6C;AAChF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,aAAa,KAAK,WAAW;AAAA,QAC1D,MAAM,EAAE,OAAO,IAAI,IAAI,aAA0B,WAAW,eAAA;AAAA,MAAe;AAAA,MAE7E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,eAAe,IAAwC;AACrD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,eAAe,EAAE;AAAA,QAC9C,MAAM,EAAE,OAAO,IAAI,WAAW,iBAAA;AAAA,MAAiB;AAAA,MAEjD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,YACE,SACA,QACA,gBACA,aAC0B;AAC1B,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,YAAY,SAAS,QAAQ,gBAAgB,WAAW;AAAA,QACrF,MAAM,EAAE,OAAO,QAAQ,IAAI,WAAW,cAAA;AAAA,MAAc;AAAA,MAEtD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,WAAW,KAAwB,WAAqC;AACtE,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,WAAW,KAAK,SAAS;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,aAAA;AAAA,MAAa;AAAA,MAEjD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,YAAY,KAAwB,aAAwC;AAC1E,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,YAAY,KAAK,WAAW;AAAA,QACzD,MAAM,EAAE,OAAO,IAAI,IAAI,aAA0B,WAAW,cAAA;AAAA,MAAc;AAAA,MAE5E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,kBACE,KACA,MACA,OACA,SACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAkB,KAAK,MAAM,OAAO,OAAO;AAAA,QACxE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAE/E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,eACE,KACA,MACA,YACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,eAAe,KAAK,MAAM,UAAU;AAAA,QACjE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,iBAAA;AAAA,MAAiB;AAAA,MAE5E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,mBAAmB,KAAwB,MAAuC;AAChF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,mBAAmB,KAAK,IAAI;AAAA,QACzD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,qBAAA;AAAA,MAAqB;AAAA,MAEhF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,kBACE,KACA,MACA,YACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAkB,KAAK,MAAM,UAAU;AAAA,QACpE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAE/E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,gCACE,KACA,MACA,YACsB;AACtB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,gCAAgC,KAAK,MAAM,UAAU;AAAA,QAClF,MAAM;AAAA,UACJ,OAAO,IAAI;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,MAEF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,iCACE,KACA,MACA,aACsB;AACtB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,iCAAiC,KAAK,MAAM,WAAW;AAAA,QACpF,MAAM;AAAA,UACJ,OAAO,IAAI;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,MAEF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,cAAc,KAAwB,QAA4C;AAChF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,QAAgB,WAAW,gBAAA;AAAA,MAAgB;AAAA,MAEpE,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,cAAc,KAAwB,MAAgD;AACpF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,cAAc,KAAK,IAAI;AAAA,QACpD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,gBAAA;AAAA,MAAgB;AAAA,MAE3E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,gBAAgB,KAAwB,MAA+C;AACrF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,gBAAgB,KAAK,IAAI;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,kBAAA;AAAA,MAAkB;AAAA,MAE7E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,gBAAgB,KAAwB,MAA+C;AACrF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,gBAAgB,KAAK,IAAI;AAAA,QACtD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,WAAW,kBAAA;AAAA,MAAkB;AAAA,MAE7E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA,EAIA,MAAM,OAAoC;AACxC,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,MAAM,KAAK;AAAA,QACxC,MAAM,EAAE,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,EAAE,KAAK,GAAG,GAAG,WAAW,QAAA;AAAA,MAAQ;AAAA,MAE5E,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,WAAW,cAAiF;AAC1F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,WAAW,YAAY;AAAA,QACpD,MAAM;AAAA,UACJ,OAAO,aAAa,IAAI,CAAC,WAAW,OAAO,KAAK,EAAE,KAAK,GAAG;AAAA,UAC1D,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,MAEF,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,qBAAqB,KAAwB,SAAiD;AAC5F,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,qBAAqB,KAAK,OAAO;AAAA,QAC9D,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,uBAAA;AAAA,MAAuB;AAAA,MAE3D,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,WAAW,KAA8C;AACvD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,WAAW,GAAG;AAAA,QAC3C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,aAAA;AAAA,MAAa;AAAA,MAEjD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,cAAc,KAA0C;AACtD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,cAAc,GAAG;AAAA,QAC9C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,gBAAA;AAAA,MAAgB;AAAA,MAEpD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA,EAEA,oBAAsC;AACpC,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,kBAAA;AAAA,QAC7B,MAAM,EAAE,WAAW,oBAAA;AAAA,MAAoB;AAAA,MAEzC,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,sBACE,KACA,cACA,eACA,cACkB;AAClB,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MACP,KAAK,SAAS,sBAAsB,KAAK,cAAc,eAAe,YAAY;AAAA,QACpF,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,wBAAA;AAAA,MAAwB;AAAA,MAE5D,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,KAA0C;AACzD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,iBAAiB,GAAG;AAAA,QACjD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,mBAAA;AAAA,MAAmB;AAAA,MAEvD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,KAAwB,eAAyC;AACtF,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,uBAAuB,KAAK,aAAa;AAAA,QACtE,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,yBAAA;AAAA,MAAyB;AAAA,MAE7D,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAA0C;AACpD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,YAAY,GAAG;AAAA,QAC5C,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,cAAA;AAAA,MAAc;AAAA,MAElD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAA0C;AACxD,WAAO,KAAK,YAAY;AAAA,MACtB;AAAA,QACE,SAAS,MAAM,KAAK,SAAS,gBAAgB,GAAG;AAAA,QAChD,MAAM,EAAE,OAAO,IAAI,IAAI,WAAW,kBAAA;AAAA,MAAkB;AAAA,MAEtD,EAAE,UAAU,SAAS,OAAA;AAAA,IAAO;AAAA,EAEhC;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("@embedpdf/models"),t="TaskQueue",r="Queue";var n=(e=>(e[e.CRITICAL=3]="CRITICAL",e[e.HIGH=2]="HIGH",e[e.MEDIUM=1]="MEDIUM",e[e.LOW=0]="LOW",e))(n||{});class o{constructor(t={}){this.queue=[],this.running=0,this.resultTasks=new Map,this.idleListeners=new Set;const{concurrency:r=1,comparator:n,ranker:o,onIdle:i,maxQueueSize:u,autoStart:a=!0,logger:s}=t;this.logger=s??new e.NoopLogger,this.opts={concurrency:Math.max(1,r),comparator:n,ranker:o,onIdle:i??(()=>{}),maxQueueSize:u??Number.POSITIVE_INFINITY,autoStart:a}}setComparator(e){this.opts.comparator=e}setRanker(e){this.opts.ranker=e}size(){return this.queue.length}inFlight(){return this.running}isIdle(){return 0===this.queue.length&&0===this.running}async drain(){this.isIdle()||await new Promise(e=>{const t=()=>{this.isIdle()&&(this.offIdle(t),e())};this.onIdle(t)})}notifyIdle(){this.isIdle()&&([...this.idleListeners].forEach(e=>e()),this.idleListeners.clear(),this.opts.onIdle())}onIdle(e){this.idleListeners.add(e)}offIdle(e){this.idleListeners.delete(e)}enqueue(n,o={}){const i=this.generateId(),u=o.priority??1,a=new e.Task;if(this.queue.length>=this.opts.maxQueueSize){const e=new Error("Queue is full (maxQueueSize reached).");return a.reject(e),a}this.resultTasks.set(i,a);const s={id:i,priority:u,meta:o.meta??n.meta,executeFactory:n.execute};this.queue.push(s),this.logger.debug(t,r,`Task enqueued: ${i} | Priority: ${u} | Running: ${this.running} | Queued: ${this.queue.length}`);const d=a.abort.bind(a);return a.abort=e=>{this.logger.debug(t,r,`Task aborted: ${i}`),this.cancel(i),d(e)},this.opts.autoStart&&this.process(!0===o.fifo),a}cancel(e){const n=this.queue.length;this.queue=this.queue.filter(t=>t.id!==e||(t.cancelled=!0,!1)),this.resultTasks.delete(e),n!==this.queue.length&&(this.logger.debug(t,r,`Task cancelled and removed: ${e}`),this.kick())}kick(){queueMicrotask(()=>this.process())}async process(e=!1){for(this.logger.debug(t,r,`process() called | Running: ${this.running} | Concurrency: ${this.opts.concurrency} | Queued: ${this.queue.length}`);this.running<this.opts.concurrency&&this.queue.length>0;){this.logger.debug(t,r,`Starting new task | Running: ${this.running} | Queued: ${this.queue.length}`),e||this.sortQueue();const n=this.queue.shift();if(n.cancelled){this.logger.debug(t,r,`Skipping cancelled task: ${n.id}`);continue}const o=this.resultTasks.get(n.id);o&&(this.running++,(async()=>{let e=null;try{if(e=n.executeFactory(),!e)throw new Error("Task factory returned null/undefined");e.wait(e=>{0===o.state.stage&&o.resolve(e)},e=>{0===o.state.stage&&("abort"===e.type?o.abort(e.reason):o.reject(e.reason))}),e.onProgress(e=>{o.progress(e)}),await e.toPromise()}catch(i){0===o.state.stage&&o.reject(i)}finally{this.resultTasks.delete(n.id),this.running--,this.logger.debug(t,r,`Task completed: ${n.id} | Running: ${this.running} | Queued: ${this.queue.length}`),this.isIdle()?this.notifyIdle():this.queue.length>0&&this.kick()}})().catch(e=>{this.logger.error(t,r,"Unhandled error in task execution wrapper:",e),this.running=Math.max(0,this.running-1),this.isIdle()?this.notifyIdle():this.queue.length>0&&this.kick()}))}}sortQueue(){const{comparator:e,ranker:t}=this.opts;if(e)return void this.queue.sort(e);const r=new Map,n=e=>t?(r.has(e.id)||r.set(e.id,t(e)),r.get(e.id)):this.defaultRank(e);this.queue.sort((e,t)=>{if(e.priority!==t.priority)return t.priority-e.priority;const r=n(e),o=n(t);return r!==o?o-r:this.extractTime(e.id)-this.extractTime(t.id)})}defaultRank(e){return 0}generateId(){return"undefined"!=typeof crypto&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}extractTime(e){const t=Number(e.split("-")[0]);return Number.isFinite(t)?t:0}}const i="PdfEngine",u="Orchestrator";exports.PdfEngine=class{constructor(t,r){this.executor=t,this.logger=r.logger??new e.NoopLogger,this.options={imageConverter:r.imageConverter,fetcher:r.fetcher??("undefined"!=typeof fetch?(e,t)=>fetch(e,t):void 0),logger:this.logger},this.workerQueue=new o({concurrency:1,autoStart:!0,logger:this.logger}),this.logger.debug(i,u,"PdfEngine orchestrator created")}chunkArray(e,t){const r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}isSupport(t){const r=new e.Task;return r.resolve([e.PdfEngineOperation.Create,e.PdfEngineOperation.Read,e.PdfEngineOperation.Update,e.PdfEngineOperation.Delete]),r}destroy(){var t,r;const n=new e.Task;try{this.executor.destroy(),null==(r=(t=this.options.imageConverter).destroy)||r.call(t),n.resolve(!0)}catch(o){n.reject({code:e.PdfErrorCode.Unknown,message:String(o)})}return n}openDocumentUrl(t,r){const n=new e.Task;return(async()=>{try{if(!this.options.fetcher)throw new Error("Fetcher is not set");const e=await this.options.fetcher(t.url,null==r?void 0:r.requestOptions),o=await e.arrayBuffer(),i={id:t.id,content:o};this.openDocumentBuffer(i,{password:null==r?void 0:r.password,normalizeRotation:null==r?void 0:r.normalizeRotation}).wait(e=>n.resolve(e),e=>n.fail(e))}catch(o){n.reject({code:e.PdfErrorCode.Unknown,message:String(o)})}})(),n}openDocumentBuffer(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.openDocumentBuffer(e,t),meta:{docId:e.id,operation:"openDocumentBuffer"}},{priority:n.CRITICAL})}getMetadata(e){return this.workerQueue.enqueue({execute:()=>this.executor.getMetadata(e),meta:{docId:e.id,operation:"getMetadata"}},{priority:n.MEDIUM})}setMetadata(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.setMetadata(e,t),meta:{docId:e.id,operation:"setMetadata"}},{priority:n.MEDIUM})}getDocPermissions(e){return this.workerQueue.enqueue({execute:()=>this.executor.getDocPermissions(e),meta:{docId:e.id,operation:"getDocPermissions"}},{priority:n.MEDIUM})}getDocUserPermissions(e){return this.workerQueue.enqueue({execute:()=>this.executor.getDocUserPermissions(e),meta:{docId:e.id,operation:"getDocUserPermissions"}},{priority:n.MEDIUM})}getSignatures(e){return this.workerQueue.enqueue({execute:()=>this.executor.getSignatures(e),meta:{docId:e.id,operation:"getSignatures"}},{priority:n.MEDIUM})}getBookmarks(e){return this.workerQueue.enqueue({execute:()=>this.executor.getBookmarks(e),meta:{docId:e.id,operation:"getBookmarks"}},{priority:n.MEDIUM})}setBookmarks(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.setBookmarks(e,t),meta:{docId:e.id,operation:"setBookmarks"}},{priority:n.MEDIUM})}deleteBookmarks(e){return this.workerQueue.enqueue({execute:()=>this.executor.deleteBookmarks(e),meta:{docId:e.id,operation:"deleteBookmarks"}},{priority:n.MEDIUM})}renderPage(e,t,r){return this.renderWithEncoding(()=>this.executor.renderPageRaw(e,t,r),r,e.id,t.index,n.CRITICAL)}renderPageRect(e,t,r,o){return this.renderWithEncoding(()=>this.executor.renderPageRect(e,t,r,o),o,e.id,t.index,n.HIGH)}renderPageRaw(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.renderPageRaw(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"renderPageRaw"}},{priority:n.HIGH})}renderPageRectRaw(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.renderPageRect(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"renderPageRectRaw"}},{priority:n.HIGH})}renderThumbnail(e,t,r){return this.renderWithEncoding(()=>this.executor.renderThumbnailRaw(e,t,r),r,e.id,t.index,n.MEDIUM)}renderPageAnnotation(e,t,r,o){return this.renderWithEncoding(()=>this.executor.renderPageAnnotationRaw(e,t,r,o),o,e.id,t.index,n.MEDIUM)}renderPageAnnotations(t,r,o){const i=new e.Task,u=this.workerQueue.enqueue({execute:()=>this.executor.renderPageAnnotationsRaw(t,r,o),meta:{docId:t.id,pageIndex:r.index,operation:"renderPageAnnotationsRaw"}},{priority:n.MEDIUM}),a=i.abort.bind(i);return i.abort=e=>{u.abort(e),a(e)},u.wait(e=>{0===i.state.stage&&this.encodeAppearanceMap(e,o,i)},e=>{0===i.state.stage&&i.fail(e)}),i}renderPageAnnotationsRaw(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.renderPageAnnotationsRaw(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"renderPageAnnotationsRaw"}},{priority:n.MEDIUM})}renderWithEncoding(t,r,o,i,u=n.CRITICAL){const a=new e.Task,s=this.workerQueue.enqueue({execute:()=>t(),meta:{docId:o,pageIndex:i,operation:"render"}},{priority:u}),d=a.abort.bind(a);return a.abort=e=>{s.abort(e),d(e)},s.wait(e=>{0===a.state.stage&&this.encodeImage(e,r,a)},e=>{0===a.state.stage&&a.fail(e)}),a}encodeImage(t,r,n){const o=(null==r?void 0:r.imageType)??"image/png",i=null==r?void 0:r.quality,u={data:new Uint8ClampedArray(t.data),width:t.width,height:t.height};this.options.imageConverter(()=>u,o,i).then(e=>n.resolve(e)).catch(t=>n.reject({code:e.PdfErrorCode.Unknown,message:String(t)}))}encodeAppearanceMap(t,r,n){const o=(null==r?void 0:r.imageType)??"image/png",i=null==r?void 0:r.imageQuality,u=e=>{const t={data:new Uint8ClampedArray(e.data),width:e.width,height:e.height};return this.options.imageConverter(()=>t,o,i)},a=[],s={},d=["normal","rollover","down"];for(const[e,c]of Object.entries(t)){const t={};s[e]=t;for(const e of d){const r=c[e];r&&a.push(u(r.data).then(n=>{t[e]={data:n,rect:r.rect}}))}}Promise.all(a).then(()=>{0===n.state.stage&&n.resolve(s)}).catch(t=>{0===n.state.stage&&n.reject({code:e.PdfErrorCode.Unknown,message:String(t)})})}getPageAnnotations(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageAnnotations(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageAnnotations"}},{priority:n.MEDIUM})}createPageAnnotation(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.createPageAnnotation(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"createPageAnnotation"}},{priority:n.MEDIUM})}updatePageAnnotation(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.updatePageAnnotation(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"updatePageAnnotation"}},{priority:n.MEDIUM})}removePageAnnotation(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.removePageAnnotation(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"removePageAnnotation"}},{priority:n.MEDIUM})}getAllAnnotations(t){const r=this.chunkArray(t.pages,500);this.logger.debug(i,u,`getAllAnnotations: ${t.pages.length} pages in ${r.length} chunks`);const o=new e.CompoundTask({aggregate:e=>Object.assign({},...e)});return r.forEach((e,r)=>{const i=this.workerQueue.enqueue({execute:()=>this.executor.getAnnotationsBatch(t,e),meta:{docId:t.id,operation:"getAnnotationsBatch",chunkSize:e.length}},{priority:n.LOW});i.onProgress(e=>{o.progress({page:e.pageIndex,result:e.result})}),o.addChild(i,r)}),o.finalize(),o}getPageTextRects(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageTextRects(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageTextRects"}},{priority:n.MEDIUM})}searchAllPages(t,r,o){const a=Array.isArray(null==o?void 0:o.flags)?o.flags.reduce((e,t)=>e|t,0):(null==o?void 0:o.flags)??0,s=this.chunkArray(t.pages,25);this.logger.debug(i,u,`searchAllPages: ${t.pages.length} pages in ${s.length} chunks`);const d=new e.CompoundTask({aggregate:e=>{const t=e.flatMap(e=>Object.values(e).flat());return{results:t,total:t.length}}});return s.forEach((e,o)=>{const i=this.workerQueue.enqueue({execute:()=>this.executor.searchBatch(t,e,r,a),meta:{docId:t.id,operation:"searchBatch",chunkSize:e.length}},{priority:n.LOW});i.onProgress(e=>{d.progress({page:e.pageIndex,results:e.result})}),d.addChild(i,o)}),d.finalize(),d}getAttachments(e){return this.workerQueue.enqueue({execute:()=>this.executor.getAttachments(e),meta:{docId:e.id,operation:"getAttachments"}},{priority:n.MEDIUM})}addAttachment(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.addAttachment(e,t),meta:{docId:e.id,operation:"addAttachment"}},{priority:n.MEDIUM})}removeAttachment(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.removeAttachment(e,t),meta:{docId:e.id,operation:"removeAttachment"}},{priority:n.MEDIUM})}readAttachmentContent(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.readAttachmentContent(e,t),meta:{docId:e.id,operation:"readAttachmentContent"}},{priority:n.MEDIUM})}getDocumentJavaScriptActions(e){return this.workerQueue.enqueue({execute:()=>this.executor.getDocumentJavaScriptActions(e),meta:{docId:e.id,operation:"getDocumentJavaScriptActions"}},{priority:n.MEDIUM})}getPageAnnoWidgets(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageAnnoWidgets(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageAnnoWidgets"}},{priority:n.MEDIUM})}getPageWidgetJavaScriptActions(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageWidgetJavaScriptActions(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageWidgetJavaScriptActions"}},{priority:n.MEDIUM})}setFormFieldValue(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.setFormFieldValue(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"setFormFieldValue"}},{priority:n.MEDIUM})}setFormFieldState(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.setFormFieldState(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"setFormFieldState"}},{priority:n.MEDIUM})}renameWidgetField(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.renameWidgetField(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"renameWidgetField"}},{priority:n.MEDIUM})}shareWidgetField(e,t,r,o,i){return this.workerQueue.enqueue({execute:()=>this.executor.shareWidgetField(e,t,r,o,i),meta:{docId:e.id,pageIndex:t.index,operation:"shareWidgetField"}},{priority:n.MEDIUM})}regenerateWidgetAppearances(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.regenerateWidgetAppearances(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"regenerateWidgetAppearances"}},{priority:n.MEDIUM})}flattenPage(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.flattenPage(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"flattenPage"}},{priority:n.MEDIUM})}extractPages(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.extractPages(e,t),meta:{docId:e.id,pageIndexes:t,operation:"extractPages"}},{priority:n.MEDIUM})}createDocument(e){return this.workerQueue.enqueue({execute:()=>this.executor.createDocument(e),meta:{docId:e,operation:"createDocument"}},{priority:n.MEDIUM})}importPages(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.importPages(e,t,r,o),meta:{docId:e.id,operation:"importPages"}},{priority:n.MEDIUM})}deletePage(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.deletePage(e,t),meta:{docId:e.id,operation:"deletePage"}},{priority:n.MEDIUM})}extractText(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.extractText(e,t),meta:{docId:e.id,pageIndexes:t,operation:"extractText"}},{priority:n.MEDIUM})}redactTextInRects(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.redactTextInRects(e,t,r,o),meta:{docId:e.id,pageIndex:t.index,operation:"redactTextInRects"}},{priority:n.MEDIUM})}applyRedaction(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.applyRedaction(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"applyRedaction"}},{priority:n.MEDIUM})}applyAllRedactions(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.applyAllRedactions(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"applyAllRedactions"}},{priority:n.MEDIUM})}flattenAnnotation(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.flattenAnnotation(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"flattenAnnotation"}},{priority:n.MEDIUM})}exportAnnotationAppearanceAsPdf(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.exportAnnotationAppearanceAsPdf(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"exportAnnotationAppearanceAsPdf"}},{priority:n.MEDIUM})}exportAnnotationsAppearanceAsPdf(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.exportAnnotationsAppearanceAsPdf(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"exportAnnotationsAppearanceAsPdf"}},{priority:n.MEDIUM})}getTextSlices(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getTextSlices(e,t),meta:{docId:e.id,slices:t,operation:"getTextSlices"}},{priority:n.MEDIUM})}getPageGlyphs(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageGlyphs(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageGlyphs"}},{priority:n.MEDIUM})}getPageGeometry(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageGeometry(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageGeometry"}},{priority:n.MEDIUM})}getPageTextRuns(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageTextRuns(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageTextRuns"}},{priority:n.MEDIUM})}merge(e){return this.workerQueue.enqueue({execute:()=>this.executor.merge(e),meta:{docId:e.map(e=>e.id).join(","),operation:"merge"}},{priority:n.MEDIUM})}mergePages(e){return this.workerQueue.enqueue({execute:()=>this.executor.mergePages(e),meta:{docId:e.map(e=>e.docId).join(","),operation:"mergePages"}},{priority:n.MEDIUM})}preparePrintDocument(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.preparePrintDocument(e,t),meta:{docId:e.id,operation:"preparePrintDocument"}},{priority:n.MEDIUM})}saveAsCopy(e){return this.workerQueue.enqueue({execute:()=>this.executor.saveAsCopy(e),meta:{docId:e.id,operation:"saveAsCopy"}},{priority:n.MEDIUM})}closeDocument(e){return this.workerQueue.enqueue({execute:()=>this.executor.closeDocument(e),meta:{docId:e.id,operation:"closeDocument"}},{priority:n.MEDIUM})}closeAllDocuments(){return this.workerQueue.enqueue({execute:()=>this.executor.closeAllDocuments(),meta:{operation:"closeAllDocuments"}},{priority:n.MEDIUM})}setDocumentEncryption(e,t,r,o){return this.workerQueue.enqueue({execute:()=>this.executor.setDocumentEncryption(e,t,r,o),meta:{docId:e.id,operation:"setDocumentEncryption"}},{priority:n.MEDIUM})}removeEncryption(e){return this.workerQueue.enqueue({execute:()=>this.executor.removeEncryption(e),meta:{docId:e.id,operation:"removeEncryption"}},{priority:n.MEDIUM})}unlockOwnerPermissions(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.unlockOwnerPermissions(e,t),meta:{docId:e.id,operation:"unlockOwnerPermissions"}},{priority:n.MEDIUM})}isEncrypted(e){return this.workerQueue.enqueue({execute:()=>this.executor.isEncrypted(e),meta:{docId:e.id,operation:"isEncrypted"}},{priority:n.MEDIUM})}isOwnerUnlocked(e){return this.workerQueue.enqueue({execute:()=>this.executor.isOwnerUnlocked(e),meta:{docId:e.id,operation:"isOwnerUnlocked"}},{priority:n.MEDIUM})}};
2
+ //# sourceMappingURL=pdf-engine-DeiICuca.cjs.map