@embedpdf/engines 2.10.1 → 2.11.0

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 (42) hide show
  1. package/dist/direct-engine-BNQEVS9L.cjs +2 -0
  2. package/dist/direct-engine-BNQEVS9L.cjs.map +1 -0
  3. package/dist/{direct-engine-4LZYs06h.js → direct-engine-cyecHjwI.js} +346 -27
  4. package/dist/direct-engine-cyecHjwI.js.map +1 -0
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.js +17 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/orchestrator/pdf-engine.d.ts +5 -0
  10. package/dist/lib/orchestrator/remote-executor.d.ts +5 -0
  11. package/dist/lib/pdfium/cache.d.ts +1 -0
  12. package/dist/lib/pdfium/engine.d.ts +51 -7
  13. package/dist/lib/pdfium/index.cjs +1 -1
  14. package/dist/lib/pdfium/index.js +3 -3
  15. package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
  16. package/dist/lib/pdfium/web/direct-engine.js +2 -2
  17. package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
  18. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
  19. package/dist/lib/pdfium/web/worker-engine.js +22 -2
  20. package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
  21. package/dist/lib/webworker/engine.cjs +1 -1
  22. package/dist/lib/webworker/engine.cjs.map +1 -1
  23. package/dist/lib/webworker/engine.d.ts +10 -0
  24. package/dist/lib/webworker/engine.js +79 -0
  25. package/dist/lib/webworker/engine.js.map +1 -1
  26. package/dist/pdf-engine-BoFryxxe.cjs +2 -0
  27. package/dist/{pdf-engine-BeHgaBOW.cjs.map → pdf-engine-BoFryxxe.cjs.map} +1 -1
  28. package/dist/{pdf-engine-sORqXhQk.js → pdf-engine-Dj-haWhC.js} +54 -1
  29. package/dist/{pdf-engine-sORqXhQk.js.map → pdf-engine-Dj-haWhC.js.map} +1 -1
  30. package/dist/preact/index.cjs +1 -1
  31. package/dist/preact/index.js +1 -1
  32. package/dist/react/index.cjs +1 -1
  33. package/dist/react/index.js +1 -1
  34. package/dist/svelte/index.cjs +1 -1
  35. package/dist/svelte/index.js +1 -1
  36. package/dist/vue/index.cjs +1 -1
  37. package/dist/vue/index.js +1 -1
  38. package/package.json +7 -7
  39. package/dist/direct-engine-4LZYs06h.js.map +0 -1
  40. package/dist/direct-engine-C29Euebw.cjs +0 -2
  41. package/dist/direct-engine-C29Euebw.cjs.map +0 -1
  42. package/dist/pdf-engine-BeHgaBOW.cjs +0 -2
@@ -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-BoFryxxe.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 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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"}
@@ -856,6 +856,33 @@ class PdfEngine {
856
856
  { priority: Priority.MEDIUM }
857
857
  );
858
858
  }
859
+ createDocument(id) {
860
+ return this.workerQueue.enqueue(
861
+ {
862
+ execute: () => this.executor.createDocument(id),
863
+ meta: { docId: id, operation: "createDocument" }
864
+ },
865
+ { priority: Priority.MEDIUM }
866
+ );
867
+ }
868
+ importPages(destDoc, srcDoc, srcPageIndices, insertIndex) {
869
+ return this.workerQueue.enqueue(
870
+ {
871
+ execute: () => this.executor.importPages(destDoc, srcDoc, srcPageIndices, insertIndex),
872
+ meta: { docId: destDoc.id, operation: "importPages" }
873
+ },
874
+ { priority: Priority.MEDIUM }
875
+ );
876
+ }
877
+ deletePage(doc, pageIndex) {
878
+ return this.workerQueue.enqueue(
879
+ {
880
+ execute: () => this.executor.deletePage(doc, pageIndex),
881
+ meta: { docId: doc.id, operation: "deletePage" }
882
+ },
883
+ { priority: Priority.MEDIUM }
884
+ );
885
+ }
859
886
  extractText(doc, pageIndexes) {
860
887
  return this.workerQueue.enqueue(
861
888
  {
@@ -901,6 +928,32 @@ class PdfEngine {
901
928
  { priority: Priority.MEDIUM }
902
929
  );
903
930
  }
931
+ exportAnnotationAppearanceAsPdf(doc, page, annotation) {
932
+ return this.workerQueue.enqueue(
933
+ {
934
+ execute: () => this.executor.exportAnnotationAppearanceAsPdf(doc, page, annotation),
935
+ meta: {
936
+ docId: doc.id,
937
+ pageIndex: page.index,
938
+ operation: "exportAnnotationAppearanceAsPdf"
939
+ }
940
+ },
941
+ { priority: Priority.MEDIUM }
942
+ );
943
+ }
944
+ exportAnnotationsAppearanceAsPdf(doc, page, annotations) {
945
+ return this.workerQueue.enqueue(
946
+ {
947
+ execute: () => this.executor.exportAnnotationsAppearanceAsPdf(doc, page, annotations),
948
+ meta: {
949
+ docId: doc.id,
950
+ pageIndex: page.index,
951
+ operation: "exportAnnotationsAppearanceAsPdf"
952
+ }
953
+ },
954
+ { priority: Priority.MEDIUM }
955
+ );
956
+ }
904
957
  getTextSlices(doc, slices) {
905
958
  return this.workerQueue.enqueue(
906
959
  {
@@ -1059,4 +1112,4 @@ class PdfEngine {
1059
1112
  export {
1060
1113
  PdfEngine as P
1061
1114
  };
1062
- //# sourceMappingURL=pdf-engine-sORqXhQk.js.map
1115
+ //# sourceMappingURL=pdf-engine-Dj-haWhC.js.map