@embedpdf/engines 2.0.0-next.2 → 2.0.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 (82) hide show
  1. package/README.md +15 -9
  2. package/dist/browser-C6QEa8uk.cjs +2 -0
  3. package/dist/browser-C6QEa8uk.cjs.map +1 -0
  4. package/dist/browser-awZxztMA.js +76 -0
  5. package/dist/browser-awZxztMA.js.map +1 -0
  6. package/dist/{engine-B-RaFU77.js → direct-engine-DuLFAbiv.js} +211 -520
  7. package/dist/direct-engine-DuLFAbiv.js.map +1 -0
  8. package/dist/direct-engine-JeNRkc7w.cjs +2 -0
  9. package/dist/direct-engine-JeNRkc7w.cjs.map +1 -0
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +301 -10
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib/converters/browser.d.ts +33 -0
  15. package/dist/lib/converters/index.cjs +1 -1
  16. package/dist/lib/converters/index.cjs.map +1 -1
  17. package/dist/lib/converters/index.d.ts +3 -51
  18. package/dist/lib/converters/index.js +6 -1
  19. package/dist/lib/converters/index.js.map +1 -1
  20. package/dist/lib/converters/node.d.ts +51 -0
  21. package/dist/lib/converters/types.d.ts +6 -3
  22. package/dist/lib/image-encoder/image-encoder-worker.d.ts +24 -0
  23. package/dist/lib/image-encoder/index.d.ts +2 -0
  24. package/dist/lib/image-encoder/worker-pool.d.ts +61 -0
  25. package/dist/lib/orchestrator/index.d.ts +16 -0
  26. package/dist/lib/orchestrator/pdf-engine.d.ts +99 -0
  27. package/dist/lib/orchestrator/pdfium-native-runner.d.ts +65 -0
  28. package/dist/lib/orchestrator/remote-executor.d.ts +93 -0
  29. package/dist/lib/orchestrator/task-queue.d.ts +87 -0
  30. package/dist/lib/pdfium/engine.d.ts +52 -93
  31. package/dist/lib/pdfium/index.cjs +1 -1
  32. package/dist/lib/pdfium/index.cjs.map +1 -1
  33. package/dist/lib/pdfium/index.d.ts +6 -1
  34. package/dist/lib/pdfium/index.js +15 -8
  35. package/dist/lib/pdfium/index.js.map +1 -1
  36. package/dist/lib/pdfium/runner.d.ts +2 -2
  37. package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
  38. package/dist/lib/pdfium/web/direct-engine.cjs.map +1 -1
  39. package/dist/lib/pdfium/web/direct-engine.d.ts +33 -2
  40. package/dist/lib/pdfium/web/direct-engine.js +5 -9
  41. package/dist/lib/pdfium/web/direct-engine.js.map +1 -1
  42. package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
  43. package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
  44. package/dist/lib/pdfium/web/worker-engine.d.ts +40 -4
  45. package/dist/lib/pdfium/web/worker-engine.js +412 -9
  46. package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
  47. package/dist/lib/webworker/engine.cjs +1 -1
  48. package/dist/lib/webworker/engine.cjs.map +1 -1
  49. package/dist/lib/webworker/engine.d.ts +0 -6
  50. package/dist/lib/webworker/engine.js +0 -13
  51. package/dist/lib/webworker/engine.js.map +1 -1
  52. package/dist/lib/webworker/runner.d.ts +0 -12
  53. package/dist/pdf-engine-BVNF_Yo9.js +790 -0
  54. package/dist/pdf-engine-BVNF_Yo9.js.map +1 -0
  55. package/dist/pdf-engine-C3JeKij1.cjs +2 -0
  56. package/dist/pdf-engine-C3JeKij1.cjs.map +1 -0
  57. package/dist/preact/index.cjs +1 -1
  58. package/dist/preact/index.cjs.map +1 -1
  59. package/dist/preact/index.js +5 -13
  60. package/dist/preact/index.js.map +1 -1
  61. package/dist/react/index.cjs +1 -1
  62. package/dist/react/index.cjs.map +1 -1
  63. package/dist/react/index.js +5 -13
  64. package/dist/react/index.js.map +1 -1
  65. package/dist/shared-preact/hooks/use-pdfium-engine.d.ts +1 -0
  66. package/dist/shared-react/hooks/use-pdfium-engine.d.ts +1 -0
  67. package/dist/svelte/index.cjs +1 -1
  68. package/dist/svelte/index.cjs.map +1 -1
  69. package/dist/svelte/index.js +3 -11
  70. package/dist/svelte/index.js.map +1 -1
  71. package/dist/vue/index.cjs +1 -1
  72. package/dist/vue/index.cjs.map +1 -1
  73. package/dist/vue/index.js +3 -12
  74. package/dist/vue/index.js.map +1 -1
  75. package/package.json +3 -3
  76. package/dist/engine-B-RaFU77.js.map +0 -1
  77. package/dist/engine-CXnLqg_9.cjs +0 -2
  78. package/dist/engine-CXnLqg_9.cjs.map +0 -1
  79. package/dist/index-Cp8_nZYM.js +0 -342
  80. package/dist/index-Cp8_nZYM.js.map +0 -1
  81. package/dist/index-DuHK0qLu.cjs +0 -2
  82. package/dist/index-DuHK0qLu.cjs.map +0 -1
@@ -0,0 +1,51 @@
1
+ import { PdfImage, ImageConversionTypes } from '@embedpdf/models';
2
+ import { ImageDataConverter } from './types';
3
+ /**
4
+ * Node.js implementation using Sharp
5
+ * This requires the 'sharp' package to be installed
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import sharp from 'sharp';
10
+ * import { createNodeImageDataToBufferConverter } from '@embedpdf/engines';
11
+ *
12
+ * const imageDataConverter = createNodeImageDataToBufferConverter(sharp);
13
+ * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });
14
+ * ```
15
+ */
16
+ export declare function createNodeImageDataToBufferConverter(sharp: any): ImageDataConverter<Buffer>;
17
+ /**
18
+ * Alternative Node.js implementation using canvas (node-canvas)
19
+ * This requires the 'canvas' package to be installed
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { createCanvas } from 'canvas';
24
+ * import { createNodeCanvasImageDataToBlobConverter } from '@embedpdf/engines';
25
+ *
26
+ * const imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);
27
+ * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });
28
+ * ```
29
+ */
30
+ export declare function createNodeCanvasImageDataToBlobConverter(createCanvas: any): ImageDataConverter<Buffer>;
31
+ /**
32
+ * Generic Node.js implementation that works with any image processing library
33
+ * that can handle raw RGBA data
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const converter = createCustomImageDataToBlobConverter(async (imageData) => {
38
+ * // Your custom image processing logic here
39
+ * // Return a Buffer that will be wrapped in a Blob
40
+ * return processImageWithYourLibrary(imageData);
41
+ * });
42
+ * ```
43
+ */
44
+ export declare function createCustomImageDataToBlobConverter(processor: (imageData: PdfImage, imageType?: ImageConversionTypes, imageQuality?: number) => Promise<Buffer>): ImageDataConverter;
45
+ /**
46
+ * Create a custom converter that returns a Buffer
47
+ * @param processor - function to process the image data
48
+ * @param imageType - image type
49
+ * @returns ImageDataToBlobConverter<Buffer>
50
+ */
51
+ export declare function createCustomImageDataToBufferConverter(processor: (imageData: PdfImage, imageType: ImageConversionTypes, imageQuality?: number) => Promise<Buffer>): ImageDataConverter<Buffer>;
@@ -1,9 +1,12 @@
1
- import { PdfImage } from '@embedpdf/models';
1
+ import { PdfImage, ImageConversionTypes } from '@embedpdf/models';
2
+ export type { ImageConversionTypes } from '@embedpdf/models';
3
+ /**
4
+ * Lazy image data getter function
5
+ */
2
6
  export type LazyImageData = () => PdfImage;
3
7
  /**
4
- * Function type for converting ImageData to Blob
8
+ * Function type for converting ImageData to Blob or other format
5
9
  * In browser: uses OffscreenCanvas
6
10
  * In Node.js: can use Sharp or other image processing libraries
7
11
  */
8
12
  export type ImageDataConverter<T = Blob> = (getImageData: LazyImageData, imageType?: ImageConversionTypes, imageQuality?: number) => Promise<T>;
9
- export type ImageConversionTypes = 'image/webp' | 'image/png' | 'image/jpeg';
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Dedicated worker for image encoding operations
3
+ * Offloads OffscreenCanvas.convertToBlob() from the main PDFium worker
4
+ */
5
+ export interface EncodeImageRequest {
6
+ id: string;
7
+ type: 'encode';
8
+ data: {
9
+ imageData: {
10
+ data: Uint8ClampedArray;
11
+ width: number;
12
+ height: number;
13
+ };
14
+ imageType: 'image/png' | 'image/jpeg' | 'image/webp';
15
+ quality?: number;
16
+ };
17
+ }
18
+ export interface EncodeImageResponse {
19
+ id: string;
20
+ type: 'result' | 'error';
21
+ data: Blob | {
22
+ message: string;
23
+ };
24
+ }
@@ -0,0 +1,2 @@
1
+ export * from './worker-pool';
2
+ export type { EncodeImageRequest, EncodeImageResponse } from './image-encoder-worker';
@@ -0,0 +1,61 @@
1
+ import { Logger } from '@embedpdf/models';
2
+ /**
3
+ * Pool of image encoding workers to offload OffscreenCanvas operations
4
+ * from the main PDFium worker thread
5
+ */
6
+ export declare class ImageEncoderWorkerPool {
7
+ private poolSize;
8
+ private workerUrl;
9
+ private workers;
10
+ private pendingTasks;
11
+ private nextWorkerId;
12
+ private requestCounter;
13
+ private logger;
14
+ /**
15
+ * Create a pool of image encoding workers
16
+ * @param poolSize - Number of workers to create (default: 2)
17
+ * @param workerUrl - URL to the worker script
18
+ * @param logger - Logger instance
19
+ */
20
+ constructor(poolSize: number | undefined, workerUrl: string, logger?: Logger);
21
+ /**
22
+ * Initialize the worker pool
23
+ */
24
+ private initialize;
25
+ /**
26
+ * Handle messages from workers
27
+ */
28
+ private handleWorkerMessage;
29
+ /**
30
+ * Handle worker errors
31
+ */
32
+ private handleWorkerError;
33
+ /**
34
+ * Get the next available worker using round-robin
35
+ */
36
+ private getNextWorker;
37
+ /**
38
+ * Encode ImageData to Blob using a worker from the pool
39
+ * @param imageData - Raw image data
40
+ * @param imageType - Target image format
41
+ * @param quality - Image quality (0-1) for lossy formats
42
+ * @returns Promise that resolves to encoded Blob
43
+ */
44
+ encode(imageData: {
45
+ data: Uint8ClampedArray;
46
+ width: number;
47
+ height: number;
48
+ }, imageType?: 'image/png' | 'image/jpeg' | 'image/webp', quality?: number): Promise<Blob>;
49
+ /**
50
+ * Destroy all workers in the pool
51
+ */
52
+ destroy(): void;
53
+ /**
54
+ * Get the number of active workers in the pool
55
+ */
56
+ get activeWorkers(): number;
57
+ /**
58
+ * Get the number of pending encoding tasks
59
+ */
60
+ get pendingTasksCount(): number;
61
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Orchestrator layer for PDF engines
3
+ *
4
+ * This module provides the "smart" orchestration layer that wraps
5
+ * the "dumb" executor (PdfiumNative or RemoteExecutor) with:
6
+ * - Priority-based task scheduling
7
+ * - Visibility-aware task ranking
8
+ * - Parallel image encoding
9
+ * - Multi-page operation orchestration
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ export * from './task-queue';
14
+ export * from './pdf-engine';
15
+ export * from './remote-executor';
16
+ export * from './pdfium-native-runner';
@@ -0,0 +1,99 @@
1
+ import { Logger, PdfEngine as IPdfEngine, PdfDocumentObject, PdfPageObject, PdfTask, PdfErrorReason, PdfFileUrl, PdfFile, PdfOpenDocumentUrlOptions, PdfOpenDocumentBufferOptions, PdfMetadataObject, PdfBookmarksObject, PdfBookmarkObject, PdfRenderPageOptions, PdfRenderThumbnailOptions, PdfRenderPageAnnotationOptions, PdfAnnotationObject, PdfTextRectObject, PdfSearchAllPagesOptions, SearchAllPagesResult, PdfPageSearchProgress, PdfAnnotationsProgress, PdfAttachmentObject, PdfAddAttachmentParams, PdfWidgetAnnoObject, FormFieldValue, PdfFlattenPageOptions, PdfPageFlattenResult, PdfRedactTextOptions, Rect, PageTextSlice, PdfGlyphObject, PdfPageGeometry, PdfPrintOptions, PdfEngineFeature, PdfEngineOperation, PdfSignatureObject, AnnotationCreateContext, CompoundTask, IPdfiumExecutor } from '@embedpdf/models';
2
+ import { ImageDataConverter } from '../converters/types';
3
+ export type { ImageDataConverter } from '../converters/types';
4
+ export type { ImageDataLike, IPdfiumExecutor, BatchProgress } from '@embedpdf/models';
5
+ export interface PdfEngineOptions<T> {
6
+ /**
7
+ * Image data converter (for encoding raw image data to Blob/other format)
8
+ */
9
+ imageConverter: ImageDataConverter<T>;
10
+ /**
11
+ * Fetch function for fetching remote URLs
12
+ */
13
+ fetcher?: typeof fetch;
14
+ /**
15
+ * Logger instance
16
+ */
17
+ logger?: Logger;
18
+ }
19
+ /**
20
+ * PdfEngine orchestrator
21
+ *
22
+ * This is the "smart" layer that:
23
+ * - Implements the PdfEngine interface
24
+ * - Uses WorkerTaskQueue for priority-based task scheduling
25
+ * - Orchestrates complex multi-page operations
26
+ * - Handles image encoding with separate encoder pool
27
+ * - Manages visibility-based task ranking
28
+ */
29
+ export declare class PdfEngine<T = Blob> implements IPdfEngine<T> {
30
+ private executor;
31
+ private workerQueue;
32
+ private logger;
33
+ private options;
34
+ constructor(executor: IPdfiumExecutor, options: PdfEngineOptions<T>);
35
+ /**
36
+ * Split an array into chunks of a given size
37
+ */
38
+ private chunkArray;
39
+ isSupport(feature: PdfEngineFeature): PdfTask<PdfEngineOperation[]>;
40
+ destroy(): PdfTask<boolean>;
41
+ openDocumentUrl(file: PdfFileUrl, options?: PdfOpenDocumentUrlOptions): PdfTask<PdfDocumentObject>;
42
+ openDocumentBuffer(file: PdfFile, options?: PdfOpenDocumentBufferOptions): PdfTask<PdfDocumentObject>;
43
+ getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject>;
44
+ setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean>;
45
+ getDocPermissions(doc: PdfDocumentObject): PdfTask<number>;
46
+ getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number>;
47
+ getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]>;
48
+ getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject>;
49
+ setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean>;
50
+ deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean>;
51
+ renderPage(doc: PdfDocumentObject, page: PdfPageObject, options?: PdfRenderPageOptions): PdfTask<T>;
52
+ renderPageRect(doc: PdfDocumentObject, page: PdfPageObject, rect: Rect, options?: PdfRenderPageOptions): PdfTask<T>;
53
+ renderThumbnail(doc: PdfDocumentObject, page: PdfPageObject, options?: PdfRenderThumbnailOptions): PdfTask<T>;
54
+ renderPageAnnotation(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfAnnotationObject, options?: PdfRenderPageAnnotationOptions): PdfTask<T>;
55
+ /**
56
+ * Helper to render and encode in two stages with priority queue
57
+ */
58
+ private renderWithEncoding;
59
+ /**
60
+ * Encode image using encoder pool or inline
61
+ */
62
+ private encodeImage;
63
+ getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]>;
64
+ createPageAnnotation<A extends PdfAnnotationObject>(doc: PdfDocumentObject, page: PdfPageObject, annotation: A, context?: AnnotationCreateContext<A>): PdfTask<string>;
65
+ updatePageAnnotation(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfAnnotationObject): PdfTask<boolean>;
66
+ removePageAnnotation(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfAnnotationObject): PdfTask<boolean>;
67
+ /**
68
+ * Get all annotations across all pages
69
+ * Uses batched operations to reduce queue overhead
70
+ */
71
+ getAllAnnotations(doc: PdfDocumentObject): CompoundTask<Record<number, PdfAnnotationObject[]>, PdfErrorReason, PdfAnnotationsProgress>;
72
+ getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]>;
73
+ /**
74
+ * Search across all pages
75
+ * Uses batched operations to reduce queue overhead
76
+ */
77
+ searchAllPages(doc: PdfDocumentObject, keyword: string, options?: PdfSearchAllPagesOptions): PdfTask<SearchAllPagesResult, PdfPageSearchProgress>;
78
+ getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]>;
79
+ addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean>;
80
+ removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean>;
81
+ readAttachmentContent(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<ArrayBuffer>;
82
+ setFormFieldValue(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfWidgetAnnoObject, value: FormFieldValue): PdfTask<boolean>;
83
+ flattenPage(doc: PdfDocumentObject, page: PdfPageObject, options?: PdfFlattenPageOptions): PdfTask<PdfPageFlattenResult>;
84
+ extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer>;
85
+ extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string>;
86
+ redactTextInRects(doc: PdfDocumentObject, page: PdfPageObject, rects: Rect[], options?: PdfRedactTextOptions): PdfTask<boolean>;
87
+ getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]>;
88
+ getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]>;
89
+ getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry>;
90
+ merge(files: PdfFile[]): PdfTask<PdfFile>;
91
+ mergePages(mergeConfigs: Array<{
92
+ docId: string;
93
+ pageIndices: number[];
94
+ }>): PdfTask<PdfFile>;
95
+ preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer>;
96
+ saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer>;
97
+ closeDocument(doc: PdfDocumentObject): PdfTask<boolean>;
98
+ closeAllDocuments(): PdfTask<boolean>;
99
+ }
@@ -0,0 +1,65 @@
1
+ import { Logger, TaskError } from '@embedpdf/models';
2
+ import { PdfiumNative } from '../pdfium/engine';
3
+ /**
4
+ * Request message from main thread
5
+ */
6
+ export interface WorkerRequest {
7
+ id: string;
8
+ type: 'execute' | 'init';
9
+ method?: string;
10
+ args?: any[];
11
+ wasmUrl?: string;
12
+ }
13
+ /**
14
+ * Response message to main thread
15
+ */
16
+ export interface WorkerResponse {
17
+ id: string;
18
+ type: 'result' | 'error' | 'progress' | 'ready';
19
+ data?: any;
20
+ error?: TaskError<any>;
21
+ progress?: any;
22
+ }
23
+ /**
24
+ * PdfiumNativeRunner - Worker runner for PdfiumNative
25
+ *
26
+ * This handles:
27
+ * - Initialization of PdfiumNative in worker context
28
+ * - Message handling from main thread
29
+ * - Task execution and result forwarding
30
+ * - Progress tracking
31
+ */
32
+ export declare class PdfiumNativeRunner {
33
+ native: PdfiumNative | null;
34
+ logger: Logger;
35
+ private activeTasks;
36
+ constructor(logger?: Logger);
37
+ /**
38
+ * Initialize PDFium with WASM binary
39
+ */
40
+ prepare(wasmBinary: ArrayBuffer, logger?: Logger): Promise<void>;
41
+ /**
42
+ * Start listening for messages
43
+ */
44
+ listen(): void;
45
+ /**
46
+ * Handle incoming messages
47
+ */
48
+ handle(evt: MessageEvent<WorkerRequest>): void;
49
+ /**
50
+ * Handle initialization request
51
+ */
52
+ private handleInit;
53
+ /**
54
+ * Handle method execution request
55
+ */
56
+ private handleExecute;
57
+ /**
58
+ * Send response back to main thread
59
+ */
60
+ private respond;
61
+ /**
62
+ * Ready notification
63
+ */
64
+ ready(): void;
65
+ }
@@ -0,0 +1,93 @@
1
+ import { BatchProgress, Logger, PdfDocumentObject, PdfPageObject, PdfTask, PdfFile, PdfOpenDocumentBufferOptions, PdfMetadataObject, PdfBookmarksObject, PdfBookmarkObject, PdfRenderPageOptions, PdfRenderThumbnailOptions, PdfRenderPageAnnotationOptions, PdfAnnotationObject, PdfTextRectObject, PdfAttachmentObject, PdfAddAttachmentParams, PdfWidgetAnnoObject, FormFieldValue, PdfFlattenPageOptions, PdfPageFlattenResult, PdfRedactTextOptions, Rect, PageTextSlice, PdfGlyphObject, PdfPageGeometry, PdfPrintOptions, PdfSignatureObject, AnnotationCreateContext, SearchResult, IPdfiumExecutor, ImageDataLike } from '@embedpdf/models';
2
+ /**
3
+ * Options for creating a RemoteExecutor
4
+ */
5
+ export interface RemoteExecutorOptions {
6
+ /**
7
+ * URL to the pdfium.wasm file (required)
8
+ */
9
+ wasmUrl: string;
10
+ /**
11
+ * Logger instance for debugging
12
+ */
13
+ logger?: Logger;
14
+ }
15
+ /**
16
+ * RemoteExecutor - Proxy for worker communication
17
+ *
18
+ * This implements IPdfExecutor but forwards all calls to a Web Worker.
19
+ * It handles:
20
+ * - Serialization/deserialization of messages
21
+ * - Promise/Task conversion
22
+ * - Error handling
23
+ * - Progress tracking
24
+ */
25
+ export declare class RemoteExecutor implements IPdfiumExecutor {
26
+ private worker;
27
+ private static READY_TASK_ID;
28
+ private pendingRequests;
29
+ private requestCounter;
30
+ private logger;
31
+ private readyTask;
32
+ constructor(worker: Worker, options: RemoteExecutorOptions);
33
+ /**
34
+ * Generate unique request ID
35
+ */
36
+ private generateId;
37
+ /**
38
+ * Send a message to the worker and return a Task
39
+ * Waits for worker to be ready before sending
40
+ */
41
+ private send;
42
+ /**
43
+ * Handle messages from worker
44
+ */
45
+ private handleMessage;
46
+ /**
47
+ * Cleanup and terminate worker
48
+ */
49
+ destroy(): void;
50
+ openDocumentBuffer(file: PdfFile, options?: PdfOpenDocumentBufferOptions): PdfTask<PdfDocumentObject>;
51
+ getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject>;
52
+ setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean>;
53
+ getDocPermissions(doc: PdfDocumentObject): PdfTask<number>;
54
+ getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number>;
55
+ getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]>;
56
+ getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject>;
57
+ setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean>;
58
+ deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean>;
59
+ renderPageRaw(doc: PdfDocumentObject, page: PdfPageObject, options?: PdfRenderPageOptions): PdfTask<ImageDataLike>;
60
+ renderPageRect(doc: PdfDocumentObject, page: PdfPageObject, rect: Rect, options?: PdfRenderPageOptions): PdfTask<ImageDataLike>;
61
+ renderThumbnailRaw(doc: PdfDocumentObject, page: PdfPageObject, options?: PdfRenderThumbnailOptions): PdfTask<ImageDataLike>;
62
+ renderPageAnnotationRaw(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfAnnotationObject, options?: PdfRenderPageAnnotationOptions): PdfTask<ImageDataLike>;
63
+ getPageAnnotationsRaw(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]>;
64
+ getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]>;
65
+ createPageAnnotation<A extends PdfAnnotationObject>(doc: PdfDocumentObject, page: PdfPageObject, annotation: A, context?: AnnotationCreateContext<A>): PdfTask<string>;
66
+ updatePageAnnotation(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfAnnotationObject): PdfTask<boolean>;
67
+ removePageAnnotation(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfAnnotationObject): PdfTask<boolean>;
68
+ getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]>;
69
+ searchInPage(doc: PdfDocumentObject, page: PdfPageObject, keyword: string, flags: number): PdfTask<SearchResult[]>;
70
+ getAnnotationsBatch(doc: PdfDocumentObject, pages: PdfPageObject[]): PdfTask<Record<number, PdfAnnotationObject[]>, BatchProgress<PdfAnnotationObject[]>>;
71
+ searchBatch(doc: PdfDocumentObject, pages: PdfPageObject[], keyword: string, flags: number): PdfTask<Record<number, SearchResult[]>, BatchProgress<SearchResult[]>>;
72
+ getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]>;
73
+ addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean>;
74
+ removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean>;
75
+ readAttachmentContent(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<ArrayBuffer>;
76
+ setFormFieldValue(doc: PdfDocumentObject, page: PdfPageObject, annotation: PdfWidgetAnnoObject, value: FormFieldValue): PdfTask<boolean>;
77
+ flattenPage(doc: PdfDocumentObject, page: PdfPageObject, options?: PdfFlattenPageOptions): PdfTask<PdfPageFlattenResult>;
78
+ extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer>;
79
+ extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string>;
80
+ redactTextInRects(doc: PdfDocumentObject, page: PdfPageObject, rects: Rect[], options?: PdfRedactTextOptions): PdfTask<boolean>;
81
+ getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]>;
82
+ getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]>;
83
+ getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry>;
84
+ merge(files: PdfFile[]): PdfTask<PdfFile>;
85
+ mergePages(mergeConfigs: Array<{
86
+ docId: string;
87
+ pageIndices: number[];
88
+ }>): PdfTask<PdfFile>;
89
+ preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer>;
90
+ saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer>;
91
+ closeDocument(doc: PdfDocumentObject): PdfTask<boolean>;
92
+ closeAllDocuments(): PdfTask<boolean>;
93
+ }
@@ -0,0 +1,87 @@
1
+ import { Task, Logger } from '@embedpdf/models';
2
+ export declare enum Priority {
3
+ CRITICAL = 3,
4
+ HIGH = 2,
5
+ MEDIUM = 1,
6
+ LOW = 0
7
+ }
8
+ /**
9
+ * Extract result type from Task
10
+ */
11
+ export type ExtractTaskResult<T> = T extends Task<infer R, any, any> ? R : never;
12
+ /**
13
+ * Extract error type from Task
14
+ */
15
+ export type ExtractTaskError<T> = T extends Task<any, infer D, any> ? D : never;
16
+ /**
17
+ * Extract progress type from Task
18
+ */
19
+ export type ExtractTaskProgress<T> = T extends Task<any, any, infer P> ? P : never;
20
+ export interface QueuedTask<T extends Task<any, any, any>> {
21
+ id: string;
22
+ priority: Priority;
23
+ meta?: Record<string, unknown>;
24
+ executeFactory: () => T;
25
+ cancelled?: boolean;
26
+ }
27
+ export interface EnqueueOptions {
28
+ priority?: Priority;
29
+ meta?: Record<string, unknown>;
30
+ fifo?: boolean;
31
+ }
32
+ export type TaskComparator = (a: QueuedTask<any>, b: QueuedTask<any>) => number;
33
+ export type TaskRanker = (task: QueuedTask<any>) => number;
34
+ export interface WorkerTaskQueueOptions {
35
+ concurrency?: number;
36
+ comparator?: TaskComparator;
37
+ ranker?: TaskRanker;
38
+ onIdle?: () => void;
39
+ maxQueueSize?: number;
40
+ autoStart?: boolean;
41
+ logger?: Logger;
42
+ }
43
+ export declare class WorkerTaskQueue {
44
+ private queue;
45
+ private running;
46
+ private resultTasks;
47
+ private logger;
48
+ private opts;
49
+ constructor(options?: WorkerTaskQueueOptions);
50
+ setComparator(comparator?: TaskComparator): void;
51
+ setRanker(ranker?: TaskRanker): void;
52
+ size(): number;
53
+ inFlight(): number;
54
+ isIdle(): boolean;
55
+ drain(): Promise<void>;
56
+ private idleListeners;
57
+ private notifyIdle;
58
+ private onIdle;
59
+ private offIdle;
60
+ /**
61
+ * Enqueue a task factory - with automatic type inference!
62
+ *
63
+ * The factory function is ONLY called when it's the task's turn to execute.
64
+ *
65
+ * Usage:
66
+ * const task = queue.enqueue({
67
+ * execute: () => this.executor.getMetadata(doc), // Factory - not called yet!
68
+ * meta: { operation: 'getMetadata' }
69
+ * }, { priority: Priority.LOW });
70
+ *
71
+ * The returned task has the SAME type as executor.getMetadata() would return!
72
+ */
73
+ enqueue<T extends Task<any, any, any>>(taskDef: {
74
+ execute: () => T;
75
+ meta?: Record<string, unknown>;
76
+ }, options?: EnqueueOptions): T;
77
+ /**
78
+ * Cancel/remove a task from the queue
79
+ */
80
+ private cancel;
81
+ private kick;
82
+ private process;
83
+ private sortQueue;
84
+ private defaultRank;
85
+ private generateId;
86
+ private extractTime;
87
+ }