@embedpdf/engines 2.10.1 → 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 (55) 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-4LZYs06h.js → direct-engine-oh_i6TH_.js} +351 -32
  8. package/dist/direct-engine-oh_i6TH_.js.map +1 -0
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.js +18 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/converters/index.cjs +1 -1
  14. package/dist/lib/converters/index.js +1 -1
  15. package/dist/lib/image-encoder/bmp.d.ts +13 -0
  16. package/dist/lib/image-encoder/image-encoder-worker.d.ts +1 -1
  17. package/dist/lib/image-encoder/worker-pool.d.ts +1 -1
  18. package/dist/lib/orchestrator/pdf-engine.d.ts +5 -0
  19. package/dist/lib/orchestrator/remote-executor.d.ts +5 -0
  20. package/dist/lib/pdfium/cache.d.ts +1 -0
  21. package/dist/lib/pdfium/engine.d.ts +51 -7
  22. package/dist/lib/pdfium/index.cjs +1 -1
  23. package/dist/lib/pdfium/index.js +4 -4
  24. package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
  25. package/dist/lib/pdfium/web/direct-engine.js +3 -3
  26. package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
  27. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
  28. package/dist/lib/pdfium/web/worker-engine.js +147 -5
  29. package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
  30. package/dist/lib/webworker/engine.cjs +1 -1
  31. package/dist/lib/webworker/engine.cjs.map +1 -1
  32. package/dist/lib/webworker/engine.d.ts +10 -0
  33. package/dist/lib/webworker/engine.js +79 -0
  34. package/dist/lib/webworker/engine.js.map +1 -1
  35. package/dist/{pdf-engine-sORqXhQk.js → pdf-engine-D9v0RfKe.js} +56 -3
  36. package/dist/pdf-engine-D9v0RfKe.js.map +1 -0
  37. package/dist/pdf-engine-DeiICuca.cjs +2 -0
  38. package/dist/{pdf-engine-BeHgaBOW.cjs.map → pdf-engine-DeiICuca.cjs.map} +1 -1
  39. package/dist/preact/index.cjs +1 -1
  40. package/dist/preact/index.js +1 -1
  41. package/dist/react/index.cjs +1 -1
  42. package/dist/react/index.js +1 -1
  43. package/dist/svelte/index.cjs +1 -1
  44. package/dist/svelte/index.js +1 -1
  45. package/dist/vue/index.cjs +1 -1
  46. package/dist/vue/index.js +1 -1
  47. package/package.json +7 -7
  48. package/dist/browser-13mzox-R.cjs +0 -2
  49. package/dist/browser-13mzox-R.cjs.map +0 -1
  50. package/dist/browser-BISJ9naB.js.map +0 -1
  51. package/dist/direct-engine-4LZYs06h.js.map +0 -1
  52. package/dist/direct-engine-C29Euebw.cjs +0 -2
  53. package/dist/direct-engine-C29Euebw.cjs.map +0 -1
  54. package/dist/pdf-engine-BeHgaBOW.cjs +0 -2
  55. package/dist/pdf-engine-sORqXhQk.js.map +0 -1
@@ -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":"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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-engine-BeHgaBOW.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 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/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 /**\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/webp';\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 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 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","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","destroy","_b","_a","call","code","PdfErrorCode","Unknown","message","String","openDocumentUrl","file","response","requestOptions","arrayBuf","arrayBuffer","pdfFile","content","openDocumentBuffer","password","normalizeRotation","doc","fail","docId","operation","CRITICAL","getMetadata","MEDIUM","setMetadata","metadata","getDocPermissions","getDocUserPermissions","getSignatures","getBookmarks","setBookmarks","bookmarks","deleteBookmarks","renderPage","page","renderWithEncoding","renderPageRaw","index","renderPageRect","rect","HIGH","pageIndex","renderPageRectRaw","renderThumbnail","renderThumbnailRaw","renderPageAnnotation","annotation","renderPageAnnotationRaw","renderPageAnnotations","renderHandle","renderPageAnnotationsRaw","rawMap","encodeAppearanceMap","renderFn","rawImageData","encodeImage","imageType","quality","plainImageData","data","Uint8ClampedArray","width","height","then","imageQuality","convertImage","jobs","encodedMap","modes","annotationId","appearances","Object","entries","encodedAppearances","mode","appearance","encodedData","all","getPageAnnotations","createPageAnnotation","context","updatePageAnnotation","removePageAnnotation","getAllAnnotations","pages","compound","CompoundTask","aggregate","results","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","getDocumentJavaScriptActions","getPageAnnoWidgets","getPageWidgetJavaScriptActions","setFormFieldValue","value","setFormFieldState","field","renameWidgetField","name","shareWidgetField","sourcePage","sourceAnnotation","targetPage","targetAnnotation","regenerateWidgetAppearances","annotationIds","flattenPage","extractPages","pageIndexes","extractText","redactTextInRects","rects","applyRedaction","applyAllRedactions","flattenAnnotation","getTextSlices","slices","getPageGlyphs","getPageGeometry","getPageTextRuns","merge","files","map","join","mergePages","mergeConfigs","config","preparePrintDocument","saveAsCopy","closeDocument","closeAllDocuments","setDocumentEncryption","userPassword","ownerPassword","allowedFlags","removeEncryption","unlockOwnerPermissions","isEncrypted","isOwnerUnlocked"],"mappings":"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"}
1
+ {"version":3,"file":"pdf-engine-DeiICuca.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 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","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","destroy","_b","_a","call","code","PdfErrorCode","Unknown","message","String","openDocumentUrl","file","response","requestOptions","arrayBuf","arrayBuffer","pdfFile","content","openDocumentBuffer","password","normalizeRotation","doc","fail","docId","operation","CRITICAL","getMetadata","MEDIUM","setMetadata","metadata","getDocPermissions","getDocUserPermissions","getSignatures","getBookmarks","setBookmarks","bookmarks","deleteBookmarks","renderPage","page","renderWithEncoding","renderPageRaw","index","renderPageRect","rect","HIGH","pageIndex","renderPageRectRaw","renderThumbnail","renderThumbnailRaw","renderPageAnnotation","annotation","renderPageAnnotationRaw","renderPageAnnotations","renderHandle","renderPageAnnotationsRaw","rawMap","encodeAppearanceMap","renderFn","rawImageData","encodeImage","imageType","quality","plainImageData","data","Uint8ClampedArray","width","height","then","imageQuality","convertImage","jobs","encodedMap","modes","annotationId","appearances","Object","entries","encodedAppearances","mode","appearance","encodedData","all","getPageAnnotations","createPageAnnotation","context","updatePageAnnotation","removePageAnnotation","getAllAnnotations","pages","compound","CompoundTask","aggregate","results","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","getDocumentJavaScriptActions","getPageAnnoWidgets","getPageWidgetJavaScriptActions","setFormFieldValue","value","setFormFieldState","field","renameWidgetField","name","shareWidgetField","sourcePage","sourceAnnotation","targetPage","targetAnnotation","regenerateWidgetAppearances","annotationIds","flattenPage","extractPages","pageIndexes","createDocument","importPages","destDoc","srcDoc","srcPageIndices","insertIndex","deletePage","extractText","redactTextInRects","rects","applyRedaction","applyAllRedactions","flattenAnnotation","exportAnnotationAppearanceAsPdf","exportAnnotationsAppearanceAsPdf","annotations","getTextSlices","slices","getPageGlyphs","getPageGeometry","getPageTextRuns","merge","files","map","join","mergePages","mergeConfigs","config","preparePrintDocument","saveAsCopy","closeDocument","closeAllDocuments","setDocumentEncryption","userPassword","ownerPassword","allowedFlags","removeEncryption","unlockOwnerPermissions","isEncrypted","isOwnerUnlocked"],"mappings":"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"}