@embedpdf/engines 2.0.0-next.2 → 2.0.0-next.3

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 (76) hide show
  1. package/dist/browser-B5Y-F6il.cjs +2 -0
  2. package/dist/browser-B5Y-F6il.cjs.map +1 -0
  3. package/dist/browser-Cm3DA8l_.js +70 -0
  4. package/dist/browser-Cm3DA8l_.js.map +1 -0
  5. package/dist/{engine-B-RaFU77.js → direct-engine-BZRK27cv.js} +197 -508
  6. package/dist/direct-engine-BZRK27cv.js.map +1 -0
  7. package/dist/direct-engine-CZAhOupl.cjs +2 -0
  8. package/dist/direct-engine-CZAhOupl.cjs.map +1 -0
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.js +283 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/converters/browser.d.ts +32 -0
  14. package/dist/lib/converters/index.cjs +1 -1
  15. package/dist/lib/converters/index.cjs.map +1 -1
  16. package/dist/lib/converters/index.d.ts +3 -51
  17. package/dist/lib/converters/index.js +6 -1
  18. package/dist/lib/converters/index.js.map +1 -1
  19. package/dist/lib/converters/node.d.ts +51 -0
  20. package/dist/lib/converters/types.d.ts +6 -3
  21. package/dist/lib/image-encoder/image-encoder-worker.d.ts +24 -0
  22. package/dist/lib/image-encoder/index.d.ts +2 -0
  23. package/dist/lib/image-encoder/worker-pool.d.ts +61 -0
  24. package/dist/lib/orchestrator/index.d.ts +16 -0
  25. package/dist/lib/orchestrator/pdf-engine.d.ts +100 -0
  26. package/dist/lib/orchestrator/pdfium-native-runner.d.ts +65 -0
  27. package/dist/lib/orchestrator/remote-executor.d.ts +94 -0
  28. package/dist/lib/orchestrator/task-queue.d.ts +87 -0
  29. package/dist/lib/pdfium/engine.d.ts +50 -84
  30. package/dist/lib/pdfium/index.cjs +1 -1
  31. package/dist/lib/pdfium/index.cjs.map +1 -1
  32. package/dist/lib/pdfium/index.d.ts +5 -1
  33. package/dist/lib/pdfium/index.js +12 -7
  34. package/dist/lib/pdfium/index.js.map +1 -1
  35. package/dist/lib/pdfium/runner.d.ts +2 -2
  36. package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
  37. package/dist/lib/pdfium/web/direct-engine.cjs.map +1 -1
  38. package/dist/lib/pdfium/web/direct-engine.d.ts +33 -2
  39. package/dist/lib/pdfium/web/direct-engine.js +5 -9
  40. package/dist/lib/pdfium/web/direct-engine.js.map +1 -1
  41. package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
  42. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
  43. package/dist/lib/pdfium/web/worker-engine.d.ts +40 -4
  44. package/dist/lib/pdfium/web/worker-engine.js +415 -9
  45. package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
  46. package/dist/lib/webworker/runner.d.ts +0 -12
  47. package/dist/pdf-engine-CrarIjJ6.cjs +2 -0
  48. package/dist/pdf-engine-CrarIjJ6.cjs.map +1 -0
  49. package/dist/pdf-engine-yZzBqL_l.js +798 -0
  50. package/dist/pdf-engine-yZzBqL_l.js.map +1 -0
  51. package/dist/preact/index.cjs +1 -1
  52. package/dist/preact/index.cjs.map +1 -1
  53. package/dist/preact/index.js +3 -3
  54. package/dist/preact/index.js.map +1 -1
  55. package/dist/react/index.cjs +1 -1
  56. package/dist/react/index.cjs.map +1 -1
  57. package/dist/react/index.js +3 -3
  58. package/dist/react/index.js.map +1 -1
  59. package/dist/shared-preact/hooks/use-pdfium-engine.d.ts +1 -0
  60. package/dist/shared-react/hooks/use-pdfium-engine.d.ts +1 -0
  61. package/dist/svelte/index.cjs +1 -1
  62. package/dist/svelte/index.cjs.map +1 -1
  63. package/dist/svelte/index.js +1 -1
  64. package/dist/svelte/index.js.map +1 -1
  65. package/dist/vue/index.cjs +1 -1
  66. package/dist/vue/index.cjs.map +1 -1
  67. package/dist/vue/index.js +2 -2
  68. package/dist/vue/index.js.map +1 -1
  69. package/package.json +3 -3
  70. package/dist/engine-B-RaFU77.js.map +0 -1
  71. package/dist/engine-CXnLqg_9.cjs +0 -2
  72. package/dist/engine-CXnLqg_9.cjs.map +0 -1
  73. package/dist/index-Cp8_nZYM.js +0 -342
  74. package/dist/index-Cp8_nZYM.js.map +0 -1
  75. package/dist/index-DuHK0qLu.cjs +0 -2
  76. package/dist/index-DuHK0qLu.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"worker-engine.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
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 FormFieldValue,\n PdfFlattenPageOptions,\n PdfPageFlattenResult,\n PdfRedactTextOptions,\n Rect,\n PageTextSlice,\n PdfGlyphObject,\n PdfPageGeometry,\n PdfPrintOptions,\n PdfSignatureObject,\n AnnotationCreateContext,\n Task,\n TaskError,\n PdfErrorCode,\n SearchResult,\n serializeLogger,\n IPdfiumExecutor,\n ImageDataLike,\n} from '@embedpdf/models';\nimport type { WorkerRequest, WorkerResponse } from './pdfium-native-runner';\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\nconst LOG_SOURCE = 'RemoteExecutor';\nconst LOG_CATEGORY = 'Worker';\n\n/**\n * Message types for worker communication\n */\ntype MessageType =\n | 'initialize'\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 | '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 | 'setFormFieldValue'\n | 'flattenPage'\n | 'extractPages'\n | 'extractText'\n | 'redactTextInRects'\n | 'getTextSlices'\n | 'getPageGlyphs'\n | 'getPageGeometry'\n | 'merge'\n | 'mergePages'\n | 'preparePrintDocument'\n | 'saveAsCopy'\n | 'closeDocument'\n | 'closeAllDocuments';\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\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 });\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 initialize(): void {\n // Initialization is handled by worker creation via readyTask\n this.logger.debug(LOG_SOURCE, LOG_CATEGORY, 'RemoteExecutor initialized');\n }\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 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 ): PdfTask<boolean> {\n return this.send<boolean>('updatePageAnnotation', [doc, page, annotation]);\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 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 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 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 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 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","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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"}
@@ -119,16 +119,6 @@ export type Response = ExecuteResponse | ReadyResponse | ExecuteProgress;
119
119
  export declare class EngineRunner {
120
120
  logger: Logger;
121
121
  engine: PdfEngine | undefined;
122
- /** All running tasks, keyed by the message-id coming from the UI */
123
- private tasks;
124
- /**
125
- * Last time we yielded to the event loop
126
- */
127
- private lastYield;
128
- /**
129
- * Ids of tasks that have been cancelled
130
- */
131
- private cancelledIds;
132
122
  /**
133
123
  * Create instance of EngineRunnder
134
124
  * @param logger - logger instance
@@ -149,8 +139,6 @@ export declare class EngineRunner {
149
139
  * @protected
150
140
  */
151
141
  ready(): void;
152
- private abort;
153
- private maybeYield;
154
142
  /**
155
143
  * Execute the request
156
144
  * @param request - request that represent the pdf engine call
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("@embedpdf/models"),t="TaskQueue",r="Queue";var i=(e=>(e[e.CRITICAL=3]="CRITICAL",e[e.HIGH=2]="HIGH",e[e.MEDIUM=1]="MEDIUM",e[e.LOW=0]="LOW",e))(i||{});class o{constructor(t={}){this.queue=[],this.running=0,this.resultTasks=new Map,this.idleListeners=new Set;const{concurrency:r=1,comparator:i,ranker:o,onIdle:n,maxQueueSize:s,autoStart:u=!0,logger:a}=t;this.logger=a??new e.NoopLogger,this.opts={concurrency:Math.max(1,r),comparator:i,ranker:o,onIdle:n??(()=>{}),maxQueueSize:s??Number.POSITIVE_INFINITY,autoStart:u}}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(i,o={}){const n=this.generateId(),s=o.priority??1,u=new e.Task;if(this.queue.length>=this.opts.maxQueueSize){const e=new Error("Queue is full (maxQueueSize reached).");return u.reject(e),u}this.resultTasks.set(n,u);const a={id:n,priority:s,meta:o.meta??i.meta,executeFactory:i.execute};this.queue.push(a),this.logger.debug(t,r,`Task enqueued: ${n} | Priority: ${s} | Running: ${this.running} | Queued: ${this.queue.length}`);const c=u.abort.bind(u);return u.abort=e=>{this.logger.debug(t,r,`Task aborted: ${n}`),this.cancel(n),c(e)},this.opts.autoStart&&this.process(!0===o.fifo),u}cancel(e){const i=this.queue.length;this.queue=this.queue.filter(t=>t.id!==e||(t.cancelled=!0,!1)),this.resultTasks.delete(e),i!==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 i=this.queue.shift();if(i.cancelled){this.logger.debug(t,r,`Skipping cancelled task: ${i.id}`);continue}const o=this.resultTasks.get(i.id);o&&(this.running++,(async()=>{let e=null;try{if(e=i.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(n){0===o.state.stage&&o.reject(n)}finally{this.resultTasks.delete(i.id),this.running--,this.logger.debug(t,r,`Task completed: ${i.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,i=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=i(e),o=i(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 n="PdfEngine",s="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(n,s,"PdfEngine orchestrator created")}chunkArray(e,t){const r=[];for(let i=0;i<e.length;i+=t)r.push(e.slice(i,i+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}initialize(){const t=new e.Task;try{this.executor.initialize(),t.resolve(!0)}catch(r){t.reject({code:e.PdfErrorCode.Unknown,message:String(r)})}return t}destroy(){const t=new e.Task;try{this.executor.destroy(),t.resolve(!0)}catch(r){t.reject({code:e.PdfErrorCode.Unknown,message:String(r)})}return t}openDocumentUrl(t,r){const i=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(),n={id:t.id,content:o},s=await this.openDocumentBuffer(n,{password:null==r?void 0:r.password}).toPromise();i.resolve(s)}catch(o){i.reject({code:e.PdfErrorCode.Unknown,message:String(o)})}})(),i}openDocumentBuffer(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.openDocumentBuffer(e,t),meta:{docId:e.id,operation:"openDocumentBuffer"}},{priority:i.CRITICAL})}getMetadata(e){return this.workerQueue.enqueue({execute:()=>this.executor.getMetadata(e),meta:{docId:e.id,operation:"getMetadata"}},{priority:i.MEDIUM})}setMetadata(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.setMetadata(e,t),meta:{docId:e.id,operation:"setMetadata"}},{priority:i.MEDIUM})}getDocPermissions(e){return this.workerQueue.enqueue({execute:()=>this.executor.getDocPermissions(e),meta:{docId:e.id,operation:"getDocPermissions"}},{priority:i.MEDIUM})}getDocUserPermissions(e){return this.workerQueue.enqueue({execute:()=>this.executor.getDocUserPermissions(e),meta:{docId:e.id,operation:"getDocUserPermissions"}},{priority:i.MEDIUM})}getSignatures(e){return this.workerQueue.enqueue({execute:()=>this.executor.getSignatures(e),meta:{docId:e.id,operation:"getSignatures"}},{priority:i.MEDIUM})}getBookmarks(e){return this.workerQueue.enqueue({execute:()=>this.executor.getBookmarks(e),meta:{docId:e.id,operation:"getBookmarks"}},{priority:i.MEDIUM})}setBookmarks(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.setBookmarks(e,t),meta:{docId:e.id,operation:"setBookmarks"}},{priority:i.MEDIUM})}deleteBookmarks(e){return this.workerQueue.enqueue({execute:()=>this.executor.deleteBookmarks(e),meta:{docId:e.id,operation:"deleteBookmarks"}},{priority:i.MEDIUM})}renderPage(e,t,r){return this.renderWithEncoding(()=>this.executor.renderPageRaw(e,t,r),r,e.id,t.index,i.CRITICAL)}renderPageRect(e,t,r,o){return this.renderWithEncoding(()=>this.executor.renderPageRect(e,t,r,o),o,e.id,t.index,i.HIGH)}renderThumbnail(e,t,r){return this.renderWithEncoding(()=>this.executor.renderThumbnailRaw(e,t,r),r,e.id,t.index,i.MEDIUM)}renderPageAnnotation(e,t,r,o){return this.renderWithEncoding(()=>this.executor.renderPageAnnotationRaw(e,t,r,o),o,e.id,t.index,i.MEDIUM)}renderWithEncoding(t,r,o,n,s=i.CRITICAL){const u=new e.Task,a=this.workerQueue.enqueue({execute:()=>t(),meta:{docId:o,pageIndex:n,operation:"render"}},{priority:s}),c=u.abort.bind(u);return u.abort=e=>{a.abort(e),c(e)},a.wait(e=>{0===u.state.stage&&this.encodeImage(e,r,u)},e=>{0===u.state.stage&&u.fail(e)}),u}encodeImage(t,r,i){const o=(null==r?void 0:r.imageType)??"image/webp",n=null==r?void 0:r.quality,s={data:new Uint8ClampedArray(t.data),width:t.width,height:t.height};this.options.imageConverter(()=>s,o,n).then(e=>i.resolve(e)).catch(t=>i.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:i.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:i.MEDIUM})}updatePageAnnotation(e,t,r){return this.workerQueue.enqueue({execute:()=>this.executor.updatePageAnnotation(e,t,r),meta:{docId:e.id,pageIndex:t.index,operation:"updatePageAnnotation"}},{priority:i.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:i.MEDIUM})}getAllAnnotations(t){const r=this.chunkArray(t.pages,500);this.logger.debug(n,s,`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 n=this.workerQueue.enqueue({execute:()=>this.executor.getAnnotationsBatch(t,e),meta:{docId:t.id,operation:"getAnnotationsBatch",chunkSize:e.length}},{priority:i.LOW});n.onProgress(e=>{o.progress({page:e.pageIndex,result:e.result})}),o.addChild(n,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:i.MEDIUM})}searchAllPages(t,r,o){const u=Array.isArray(null==o?void 0:o.flags)?o.flags.reduce((e,t)=>e|t,0):(null==o?void 0:o.flags)??0,a=this.chunkArray(t.pages,25);this.logger.debug(n,s,`searchAllPages: ${t.pages.length} pages in ${a.length} chunks`);const c=new e.CompoundTask({aggregate:e=>{const t=e.flatMap(e=>Object.values(e).flat());return{results:t,total:t.length}}});return a.forEach((e,o)=>{const n=this.workerQueue.enqueue({execute:()=>this.executor.searchBatch(t,e,r,u),meta:{docId:t.id,operation:"searchBatch",chunkSize:e.length}},{priority:i.LOW});n.onProgress(e=>{c.progress({page:e.pageIndex,results:e.result})}),c.addChild(n,o)}),c.finalize(),c}getAttachments(e){return this.workerQueue.enqueue({execute:()=>this.executor.getAttachments(e),meta:{docId:e.id,operation:"getAttachments"}},{priority:i.MEDIUM})}addAttachment(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.addAttachment(e,t),meta:{docId:e.id,operation:"addAttachment"}},{priority:i.MEDIUM})}removeAttachment(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.removeAttachment(e,t),meta:{docId:e.id,operation:"removeAttachment"}},{priority:i.MEDIUM})}readAttachmentContent(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.readAttachmentContent(e,t),meta:{docId:e.id,operation:"readAttachmentContent"}},{priority:i.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:i.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:i.MEDIUM})}extractPages(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.extractPages(e,t),meta:{docId:e.id,pageIndexes:t,operation:"extractPages"}},{priority:i.MEDIUM})}extractText(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.extractText(e,t),meta:{docId:e.id,pageIndexes:t,operation:"extractText"}},{priority:i.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:i.MEDIUM})}getTextSlices(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getTextSlices(e,t),meta:{docId:e.id,slices:t,operation:"getTextSlices"}},{priority:i.MEDIUM})}getPageGlyphs(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageGlyphs(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageGlyphs"}},{priority:i.MEDIUM})}getPageGeometry(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.getPageGeometry(e,t),meta:{docId:e.id,pageIndex:t.index,operation:"getPageGeometry"}},{priority:i.MEDIUM})}merge(e){return this.workerQueue.enqueue({execute:()=>this.executor.merge(e),meta:{docId:e.map(e=>e.id).join(","),operation:"merge"}},{priority:i.MEDIUM})}mergePages(e){return this.workerQueue.enqueue({execute:()=>this.executor.mergePages(e),meta:{docId:e.map(e=>e.docId).join(","),operation:"mergePages"}},{priority:i.MEDIUM})}preparePrintDocument(e,t){return this.workerQueue.enqueue({execute:()=>this.executor.preparePrintDocument(e,t),meta:{docId:e.id,operation:"preparePrintDocument"}},{priority:i.MEDIUM})}saveAsCopy(e){return this.workerQueue.enqueue({execute:()=>this.executor.saveAsCopy(e),meta:{docId:e.id,operation:"saveAsCopy"}},{priority:i.MEDIUM})}closeDocument(e){return this.workerQueue.enqueue({execute:()=>this.executor.closeDocument(e),meta:{docId:e.id,operation:"closeDocument"}},{priority:i.MEDIUM})}closeAllDocuments(){return this.workerQueue.enqueue({execute:()=>this.executor.closeAllDocuments(),meta:{operation:"closeAllDocuments"}},{priority:i.MEDIUM})}};
2
+ //# sourceMappingURL=pdf-engine-CrarIjJ6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-engine-CrarIjJ6.cjs","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 PdfWidgetAnnoObject,\n FormFieldValue,\n PdfFlattenPageOptions,\n PdfPageFlattenResult,\n PdfRedactTextOptions,\n Rect,\n PageTextSlice,\n PdfGlyphObject,\n PdfPageGeometry,\n PdfPrintOptions,\n PdfEngineFeature,\n PdfEngineOperation,\n PdfSignatureObject,\n AnnotationCreateContext,\n Task,\n PdfErrorCode,\n SearchResult,\n CompoundTask,\n ImageDataLike,\n IPdfiumExecutor,\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 initialize(): PdfTask<boolean> {\n const task = new Task<boolean, PdfErrorReason>();\n try {\n this.executor.initialize();\n task.resolve(true);\n } catch (error) {\n task.reject({ code: PdfErrorCode.Unknown, message: String(error) });\n }\n return task;\n }\n\n destroy(): PdfTask<boolean> {\n const task = new Task<boolean, PdfErrorReason>();\n try {\n this.executor.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\n const doc = await this.openDocumentBuffer(pdfFile, {\n password: options?.password,\n }).toPromise();\n\n task.resolve(doc);\n } catch (error) {\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 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 /**\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/webp';\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 // ========== 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 ): PdfTask<boolean> {\n return this.workerQueue.enqueue(\n {\n execute: () => this.executor.updatePageAnnotation(doc, page, annotation),\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 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 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 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 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 // ========== 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"],"names":["LOG_SOURCE","LOG_CATEGORY","Priority","WorkerTaskQueue","constructor","options","this","queue","running","resultTasks","Map","idleListeners","Set","concurrency","comparator","ranker","onIdle","maxQueueSize","autoStart","logger","NoopLogger","opts","Math","max","Number","POSITIVE_INFINITY","setComparator","setRanker","size","length","inFlight","isIdle","drain","Promise","resolve","check","offIdle","notifyIdle","forEach","fn","clear","add","delete","enqueue","taskDef","id","generateId","priority","resultTask","Task","error","Error","reject","set","queuedTask","meta","executeFactory","execute","push","debug","originalAbort","abort","bind","reason","cancel","process","fifo","taskId","before","filter","t","cancelled","kick","queueMicrotask","sortQueue","shift","get","realTask","wait","result","state","stage","type","onProgress","progress","toPromise","catch","sort","rankCache","getRank","has","defaultRank","a","b","ar","br","extractTime","_task","crypto","randomUUID","Date","now","random","toString","slice","split","isFinite","executor","imageConverter","fetcher","fetch","url","init","workerQueue","chunkArray","items","chunkSize","chunks","i","isSupport","feature","task","PdfEngineOperation","Create","Read","Update","Delete","initialize","code","PdfErrorCode","Unknown","message","String","destroy","openDocumentUrl","file","response","requestOptions","arrayBuf","arrayBuffer","pdfFile","content","doc","openDocumentBuffer","password","docId","operation","CRITICAL","getMetadata","MEDIUM","setMetadata","metadata","getDocPermissions","getDocUserPermissions","getSignatures","getBookmarks","setBookmarks","bookmarks","deleteBookmarks","renderPage","page","renderWithEncoding","renderPageRaw","index","renderPageRect","rect","HIGH","renderThumbnail","renderThumbnailRaw","renderPageAnnotation","annotation","renderPageAnnotationRaw","renderFn","pageIndex","renderHandle","rawImageData","encodeImage","fail","imageType","quality","plainImageData","data","Uint8ClampedArray","width","height","then","getPageAnnotations","createPageAnnotation","context","updatePageAnnotation","removePageAnnotation","getAllAnnotations","pages","compound","CompoundTask","aggregate","results","Object","assign","chunkPages","chunkIndex","batchTask","getAnnotationsBatch","LOW","batchProgress","addChild","finalize","getPageTextRects","searchAllPages","keyword","flags","Array","isArray","reduce","acc","flag","allResults","flatMap","batchResult","values","flat","total","searchBatch","getAttachments","addAttachment","params","removeAttachment","attachment","readAttachmentContent","setFormFieldValue","value","flattenPage","extractPages","pageIndexes","extractText","redactTextInRects","rects","getTextSlices","slices","getPageGlyphs","getPageGeometry","merge","files","map","join","mergePages","mergeConfigs","config","preparePrintDocument","saveAsCopy","closeDocument","closeAllDocuments"],"mappings":"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"}