@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.
- package/README.md +15 -9
- package/dist/browser-C6QEa8uk.cjs +2 -0
- package/dist/browser-C6QEa8uk.cjs.map +1 -0
- package/dist/browser-awZxztMA.js +76 -0
- package/dist/browser-awZxztMA.js.map +1 -0
- package/dist/{engine-B-RaFU77.js → direct-engine-DuLFAbiv.js} +211 -520
- package/dist/direct-engine-DuLFAbiv.js.map +1 -0
- package/dist/direct-engine-JeNRkc7w.cjs +2 -0
- package/dist/direct-engine-JeNRkc7w.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +301 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/converters/browser.d.ts +33 -0
- package/dist/lib/converters/index.cjs +1 -1
- package/dist/lib/converters/index.cjs.map +1 -1
- package/dist/lib/converters/index.d.ts +3 -51
- package/dist/lib/converters/index.js +6 -1
- package/dist/lib/converters/index.js.map +1 -1
- package/dist/lib/converters/node.d.ts +51 -0
- package/dist/lib/converters/types.d.ts +6 -3
- package/dist/lib/image-encoder/image-encoder-worker.d.ts +24 -0
- package/dist/lib/image-encoder/index.d.ts +2 -0
- package/dist/lib/image-encoder/worker-pool.d.ts +61 -0
- package/dist/lib/orchestrator/index.d.ts +16 -0
- package/dist/lib/orchestrator/pdf-engine.d.ts +99 -0
- package/dist/lib/orchestrator/pdfium-native-runner.d.ts +65 -0
- package/dist/lib/orchestrator/remote-executor.d.ts +93 -0
- package/dist/lib/orchestrator/task-queue.d.ts +87 -0
- package/dist/lib/pdfium/engine.d.ts +52 -93
- package/dist/lib/pdfium/index.cjs +1 -1
- package/dist/lib/pdfium/index.cjs.map +1 -1
- package/dist/lib/pdfium/index.d.ts +6 -1
- package/dist/lib/pdfium/index.js +15 -8
- package/dist/lib/pdfium/index.js.map +1 -1
- package/dist/lib/pdfium/runner.d.ts +2 -2
- package/dist/lib/pdfium/web/direct-engine.cjs +1 -1
- package/dist/lib/pdfium/web/direct-engine.cjs.map +1 -1
- package/dist/lib/pdfium/web/direct-engine.d.ts +33 -2
- package/dist/lib/pdfium/web/direct-engine.js +5 -9
- package/dist/lib/pdfium/web/direct-engine.js.map +1 -1
- package/dist/lib/pdfium/web/worker-engine.cjs +1 -1
- package/dist/lib/pdfium/web/worker-engine.cjs.map +1 -1
- package/dist/lib/pdfium/web/worker-engine.d.ts +40 -4
- package/dist/lib/pdfium/web/worker-engine.js +412 -9
- package/dist/lib/pdfium/web/worker-engine.js.map +1 -1
- package/dist/lib/webworker/engine.cjs +1 -1
- package/dist/lib/webworker/engine.cjs.map +1 -1
- package/dist/lib/webworker/engine.d.ts +0 -6
- package/dist/lib/webworker/engine.js +0 -13
- package/dist/lib/webworker/engine.js.map +1 -1
- package/dist/lib/webworker/runner.d.ts +0 -12
- package/dist/pdf-engine-BVNF_Yo9.js +790 -0
- package/dist/pdf-engine-BVNF_Yo9.js.map +1 -0
- package/dist/pdf-engine-C3JeKij1.cjs +2 -0
- package/dist/pdf-engine-C3JeKij1.cjs.map +1 -0
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +5 -13
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +5 -13
- package/dist/react/index.js.map +1 -1
- package/dist/shared-preact/hooks/use-pdfium-engine.d.ts +1 -0
- package/dist/shared-react/hooks/use-pdfium-engine.d.ts +1 -0
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +3 -11
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +3 -12
- package/dist/vue/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/engine-B-RaFU77.js.map +0 -1
- package/dist/engine-CXnLqg_9.cjs +0 -2
- package/dist/engine-CXnLqg_9.cjs.map +0 -1
- package/dist/index-Cp8_nZYM.js +0 -342
- package/dist/index-Cp8_nZYM.js.map +0 -1
- package/dist/index-DuHK0qLu.cjs +0 -2
- 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,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
|
+
}
|