Skip to content

Commit 9b75e89

Browse files
committed
Move interface to the models
1 parent f7e03be commit 9b75e89

4 files changed

Lines changed: 136 additions & 118 deletions

File tree

packages/engines/src/lib/orchestrator/pdf-engine.ts

Lines changed: 5 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -43,127 +43,18 @@ import {
4343
SearchResult,
4444
CompoundTask,
4545
ImageDataLike,
46+
IPdfiumExecutor,
4647
} from '@embedpdf/models';
4748
import { WorkerTaskQueue, Priority } from './task-queue';
4849
import type { ImageDataConverter } from '../converters/types';
4950

5051
// Re-export for convenience
5152
export type { ImageDataConverter } from '../converters/types';
52-
export type { ImageDataLike } from '@embedpdf/models';
53+
export type { ImageDataLike, IPdfiumExecutor } from '@embedpdf/models';
5354

5455
const LOG_SOURCE = 'PdfEngine';
5556
const LOG_CATEGORY = 'Orchestrator';
5657

57-
/**
58-
* Executor interface that can be either PdfiumNative or RemoteExecutor
59-
*/
60-
export interface IPdfExecutor {
61-
// Core operations (single page, synchronous in nature)
62-
initialize(): void;
63-
destroy(): void;
64-
openDocumentBuffer(
65-
file: PdfFile,
66-
options?: PdfOpenDocumentBufferOptions,
67-
): PdfTask<PdfDocumentObject>;
68-
getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject>;
69-
setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean>;
70-
getDocPermissions(doc: PdfDocumentObject): PdfTask<number>;
71-
getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number>;
72-
getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]>;
73-
getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject>;
74-
setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean>;
75-
deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean>;
76-
77-
// Raw rendering (returns ImageData-like object, not Blob)
78-
renderPageRaw(
79-
doc: PdfDocumentObject,
80-
page: PdfPageObject,
81-
options?: PdfRenderPageOptions,
82-
): PdfTask<ImageDataLike>;
83-
renderPageRect(
84-
doc: PdfDocumentObject,
85-
page: PdfPageObject,
86-
rect: Rect,
87-
options?: PdfRenderPageOptions,
88-
): PdfTask<ImageDataLike>;
89-
renderThumbnailRaw(
90-
doc: PdfDocumentObject,
91-
page: PdfPageObject,
92-
options?: PdfRenderThumbnailOptions,
93-
): PdfTask<ImageDataLike>;
94-
renderPageAnnotationRaw(
95-
doc: PdfDocumentObject,
96-
page: PdfPageObject,
97-
annotation: PdfAnnotationObject,
98-
options?: PdfRenderPageAnnotationOptions,
99-
): PdfTask<ImageDataLike>;
100-
101-
// Single page operations
102-
getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]>;
103-
createPageAnnotation<A extends PdfAnnotationObject>(
104-
doc: PdfDocumentObject,
105-
page: PdfPageObject,
106-
annotation: A,
107-
context?: AnnotationCreateContext<A>,
108-
): PdfTask<string>;
109-
updatePageAnnotation(
110-
doc: PdfDocumentObject,
111-
page: PdfPageObject,
112-
annotation: PdfAnnotationObject,
113-
): PdfTask<boolean>;
114-
removePageAnnotation(
115-
doc: PdfDocumentObject,
116-
page: PdfPageObject,
117-
annotation: PdfAnnotationObject,
118-
): PdfTask<boolean>;
119-
getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]>;
120-
121-
// Single page search
122-
searchInPage(
123-
doc: PdfDocumentObject,
124-
page: PdfPageObject,
125-
keyword: string,
126-
flags: number,
127-
): PdfTask<SearchResult[]>;
128-
129-
// Other operations
130-
getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]>;
131-
addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean>;
132-
removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean>;
133-
readAttachmentContent(
134-
doc: PdfDocumentObject,
135-
attachment: PdfAttachmentObject,
136-
): PdfTask<ArrayBuffer>;
137-
setFormFieldValue(
138-
doc: PdfDocumentObject,
139-
page: PdfPageObject,
140-
annotation: PdfWidgetAnnoObject,
141-
value: FormFieldValue,
142-
): PdfTask<boolean>;
143-
flattenPage(
144-
doc: PdfDocumentObject,
145-
page: PdfPageObject,
146-
options?: PdfFlattenPageOptions,
147-
): PdfTask<PdfPageFlattenResult>;
148-
extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer>;
149-
extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string>;
150-
redactTextInRects(
151-
doc: PdfDocumentObject,
152-
page: PdfPageObject,
153-
rects: Rect[],
154-
options?: PdfRedactTextOptions,
155-
): PdfTask<boolean>;
156-
getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]>;
157-
getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]>;
158-
getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry>;
159-
merge(files: PdfFile[]): PdfTask<PdfFile>;
160-
mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>): PdfTask<PdfFile>;
161-
preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer>;
162-
saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer>;
163-
closeDocument(doc: PdfDocumentObject): PdfTask<boolean>;
164-
closeAllDocuments(): PdfTask<boolean>;
165-
}
166-
16758
export interface PdfEngineOptions<T> {
16859
/**
16960
* Image data converter (for encoding raw image data to Blob/other format)
@@ -190,12 +81,12 @@ export interface PdfEngineOptions<T> {
19081
* - Manages visibility-based task ranking
19182
*/
19283
export class PdfEngine<T = Blob> implements IPdfEngine<T> {
193-
private executor: IPdfExecutor;
84+
private executor: IPdfiumExecutor;
19485
private workerQueue: WorkerTaskQueue;
19586
private logger: Logger;
19687
private options: PdfEngineOptions<T>;
19788

198-
constructor(executor: IPdfExecutor, options: PdfEngineOptions<T>) {
89+
constructor(executor: IPdfiumExecutor, options: PdfEngineOptions<T>) {
19990
this.executor = executor;
20091
this.logger = options.logger ?? new NoopLogger();
20192
this.options = {
@@ -570,7 +461,7 @@ export class PdfEngine<T = Blob> implements IPdfEngine<T> {
570461
const tasks = doc.pages.map((page, index) =>
571462
this.workerQueue.enqueue(
572463
{
573-
execute: () => this.executor.getPageAnnotations(doc, page),
464+
execute: () => this.executor.getPageAnnotationsRaw(doc, page),
574465
meta: { docId: doc.id, pageIndex: index, operation: 'getAnnotations' },
575466
},
576467
{ priority: Priority.LOW },

packages/engines/src/lib/orchestrator/remote-executor.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ import {
3434
PdfErrorCode,
3535
SearchResult,
3636
serializeLogger,
37+
IPdfiumExecutor,
38+
ImageDataLike,
3739
} from '@embedpdf/models';
38-
import type { IPdfExecutor, ImageDataLike } from './pdf-engine';
3940
import type { WorkerRequest, WorkerResponse } from './pdfium-native-runner';
4041

4142
/**
@@ -75,6 +76,7 @@ type MessageType =
7576
| 'renderThumbnailRaw'
7677
| 'renderPageAnnotationRaw'
7778
| 'getPageAnnotations'
79+
| 'getPageAnnotationsRaw'
7880
| 'createPageAnnotation'
7981
| 'updatePageAnnotation'
8082
| 'removePageAnnotation'
@@ -109,7 +111,7 @@ type MessageType =
109111
* - Error handling
110112
* - Progress tracking
111113
*/
112-
export class RemoteExecutor implements IPdfExecutor {
114+
export class RemoteExecutor implements IPdfiumExecutor {
113115
private static READY_TASK_ID = '0';
114116
private pendingRequests = new Map<string, Task<any, any>>();
115117
private requestCounter = 0;
@@ -336,6 +338,13 @@ export class RemoteExecutor implements IPdfExecutor {
336338
return this.send<ImageDataLike>('renderPageAnnotationRaw', [doc, page, annotation, options]);
337339
}
338340

341+
getPageAnnotationsRaw(
342+
doc: PdfDocumentObject,
343+
page: PdfPageObject,
344+
): PdfTask<PdfAnnotationObject[]> {
345+
return this.send<PdfAnnotationObject[]>('getPageAnnotationsRaw', [doc, page]);
346+
}
347+
339348
getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]> {
340349
return this.send<PdfAnnotationObject[]>('getPageAnnotations', [doc, page]);
341350
}

packages/engines/src/lib/pdfium/engine.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
ImageDataLike,
3+
IPdfiumExecutor,
34
PdfActionObject,
45
PdfAnnotationObject,
56
PdfTextRectObject,
@@ -167,7 +168,7 @@ interface PdfiumEngineOptions {
167168
/**
168169
* Pdf engine that based on pdfium wasm
169170
*/
170-
export class PdfiumNative {
171+
export class PdfiumNative implements IPdfiumExecutor {
171172
/**
172173
* pdf documents that opened
173174
*/
@@ -3582,7 +3583,7 @@ export class PdfiumNative {
35823583
*
35833584
* @private
35843585
*/
3585-
readPageAnnotationsRaw(
3586+
getPageAnnotationsRaw(
35863587
doc: PdfDocumentObject,
35873588
page: PdfPageObject,
35883589
): PdfTask<PdfAnnotationObject[]> {

packages/models/src/pdf.ts

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3000,6 +3000,123 @@ export interface PdfEngine<T = Blob> {
30003000
*/
30013001
export type PdfEngineMethodName = keyof Required<PdfEngine>;
30023002

3003+
/**
3004+
* Executor interface for PDFium implementations.
3005+
* Can be either PdfiumNative (direct) or RemoteExecutor (worker proxy).
3006+
*
3007+
* @public
3008+
*/
3009+
export interface IPdfiumExecutor {
3010+
// Core operations
3011+
initialize(): void;
3012+
destroy(): void;
3013+
openDocumentBuffer(
3014+
file: PdfFile,
3015+
options?: PdfOpenDocumentBufferOptions,
3016+
): PdfTask<PdfDocumentObject>;
3017+
getMetadata(doc: PdfDocumentObject): PdfTask<PdfMetadataObject>;
3018+
setMetadata(doc: PdfDocumentObject, metadata: Partial<PdfMetadataObject>): PdfTask<boolean>;
3019+
getDocPermissions(doc: PdfDocumentObject): PdfTask<number>;
3020+
getDocUserPermissions(doc: PdfDocumentObject): PdfTask<number>;
3021+
getSignatures(doc: PdfDocumentObject): PdfTask<PdfSignatureObject[]>;
3022+
getBookmarks(doc: PdfDocumentObject): PdfTask<PdfBookmarksObject>;
3023+
setBookmarks(doc: PdfDocumentObject, bookmarks: PdfBookmarkObject[]): PdfTask<boolean>;
3024+
deleteBookmarks(doc: PdfDocumentObject): PdfTask<boolean>;
3025+
3026+
// Raw rendering (returns ImageDataLike, not Blob)
3027+
renderPageRaw(
3028+
doc: PdfDocumentObject,
3029+
page: PdfPageObject,
3030+
options?: PdfRenderPageOptions,
3031+
): PdfTask<ImageDataLike>;
3032+
renderPageRect(
3033+
doc: PdfDocumentObject,
3034+
page: PdfPageObject,
3035+
rect: Rect,
3036+
options?: PdfRenderPageOptions,
3037+
): PdfTask<ImageDataLike>;
3038+
renderThumbnailRaw(
3039+
doc: PdfDocumentObject,
3040+
page: PdfPageObject,
3041+
options?: PdfRenderThumbnailOptions,
3042+
): PdfTask<ImageDataLike>;
3043+
renderPageAnnotationRaw(
3044+
doc: PdfDocumentObject,
3045+
page: PdfPageObject,
3046+
annotation: PdfAnnotationObject,
3047+
options?: PdfRenderPageAnnotationOptions,
3048+
): PdfTask<ImageDataLike>;
3049+
3050+
// Single page operations
3051+
getPageAnnotationsRaw(
3052+
doc: PdfDocumentObject,
3053+
page: PdfPageObject,
3054+
): PdfTask<PdfAnnotationObject[]>;
3055+
getPageAnnotations(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfAnnotationObject[]>;
3056+
createPageAnnotation<A extends PdfAnnotationObject>(
3057+
doc: PdfDocumentObject,
3058+
page: PdfPageObject,
3059+
annotation: A,
3060+
context?: AnnotationCreateContext<A>,
3061+
): PdfTask<string>;
3062+
updatePageAnnotation(
3063+
doc: PdfDocumentObject,
3064+
page: PdfPageObject,
3065+
annotation: PdfAnnotationObject,
3066+
): PdfTask<boolean>;
3067+
removePageAnnotation(
3068+
doc: PdfDocumentObject,
3069+
page: PdfPageObject,
3070+
annotation: PdfAnnotationObject,
3071+
): PdfTask<boolean>;
3072+
getPageTextRects(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfTextRectObject[]>;
3073+
3074+
// Single page search
3075+
searchInPage(
3076+
doc: PdfDocumentObject,
3077+
page: PdfPageObject,
3078+
keyword: string,
3079+
flags: number,
3080+
): PdfTask<SearchResult[]>;
3081+
3082+
// Other operations
3083+
getAttachments(doc: PdfDocumentObject): PdfTask<PdfAttachmentObject[]>;
3084+
addAttachment(doc: PdfDocumentObject, params: PdfAddAttachmentParams): PdfTask<boolean>;
3085+
removeAttachment(doc: PdfDocumentObject, attachment: PdfAttachmentObject): PdfTask<boolean>;
3086+
readAttachmentContent(
3087+
doc: PdfDocumentObject,
3088+
attachment: PdfAttachmentObject,
3089+
): PdfTask<ArrayBuffer>;
3090+
setFormFieldValue(
3091+
doc: PdfDocumentObject,
3092+
page: PdfPageObject,
3093+
annotation: PdfWidgetAnnoObject,
3094+
value: FormFieldValue,
3095+
): PdfTask<boolean>;
3096+
flattenPage(
3097+
doc: PdfDocumentObject,
3098+
page: PdfPageObject,
3099+
options?: PdfFlattenPageOptions,
3100+
): PdfTask<PdfPageFlattenResult>;
3101+
extractPages(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<ArrayBuffer>;
3102+
extractText(doc: PdfDocumentObject, pageIndexes: number[]): PdfTask<string>;
3103+
redactTextInRects(
3104+
doc: PdfDocumentObject,
3105+
page: PdfPageObject,
3106+
rects: Rect[],
3107+
options?: PdfRedactTextOptions,
3108+
): PdfTask<boolean>;
3109+
getTextSlices(doc: PdfDocumentObject, slices: PageTextSlice[]): PdfTask<string[]>;
3110+
getPageGlyphs(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfGlyphObject[]>;
3111+
getPageGeometry(doc: PdfDocumentObject, page: PdfPageObject): PdfTask<PdfPageGeometry>;
3112+
merge(files: PdfFile[]): PdfTask<PdfFile>;
3113+
mergePages(mergeConfigs: Array<{ docId: string; pageIndices: number[] }>): PdfTask<PdfFile>;
3114+
preparePrintDocument(doc: PdfDocumentObject, options?: PdfPrintOptions): PdfTask<ArrayBuffer>;
3115+
saveAsCopy(doc: PdfDocumentObject): PdfTask<ArrayBuffer>;
3116+
closeDocument(doc: PdfDocumentObject): PdfTask<boolean>;
3117+
closeAllDocuments(): PdfTask<boolean>;
3118+
}
3119+
30033120
/**
30043121
* Arguments of PdfEngine method
30053122
*

0 commit comments

Comments
 (0)