@@ -110,10 +110,11 @@ type MessageType =
110110 * - Progress tracking
111111 */
112112export class RemoteExecutor implements IPdfExecutor {
113+ private static READY_TASK_ID = '0' ;
113114 private pendingRequests = new Map < string , Task < any , any > > ( ) ;
114115 private requestCounter = 0 ;
115116 private logger : Logger ;
116- private initialized = false ;
117+ private readyTask : Task < boolean , PdfErrorReason > ;
117118
118119 constructor (
119120 private worker : Worker ,
@@ -122,9 +123,13 @@ export class RemoteExecutor implements IPdfExecutor {
122123 this . logger = options . logger ?? new NoopLogger ( ) ;
123124 this . worker . addEventListener ( 'message' , this . handleMessage ) ;
124125
126+ // Create ready task - will be resolved when worker sends 'ready'
127+ this . readyTask = new Task < boolean , PdfErrorReason > ( ) ;
128+ this . pendingRequests . set ( RemoteExecutor . READY_TASK_ID , this . readyTask ) ;
129+
125130 // Send initialization message with WASM URL
126131 this . worker . postMessage ( {
127- id : '0' ,
132+ id : RemoteExecutor . READY_TASK_ID ,
128133 type : 'wasmInit' ,
129134 wasmUrl : options . wasmUrl ,
130135 logger : options . logger ? serializeLogger ( options . logger ) : undefined ,
@@ -142,22 +147,39 @@ export class RemoteExecutor implements IPdfExecutor {
142147
143148 /**
144149 * Send a message to the worker and return a Task
150+ * Waits for worker to be ready before sending
145151 */
146152 private send < T , P = unknown > ( method : MessageType , args : any [ ] ) : Task < T , PdfErrorReason , P > {
147153 const id = this . generateId ( ) ;
148154 const task = new Task < T , PdfErrorReason , P > ( ) ;
149155
150- this . pendingRequests . set ( id , task ) ;
151-
152156 const request : WorkerRequest = {
153157 id,
154158 type : 'execute' ,
155159 method,
156160 args,
157161 } ;
158162
159- this . logger . debug ( LOG_SOURCE , LOG_CATEGORY , `Sending ${ method } request:` , id ) ;
160- this . worker . postMessage ( request ) ;
163+ // Wait for worker to be ready before sending
164+ this . readyTask . wait (
165+ ( ) => {
166+ this . pendingRequests . set ( id , task ) ;
167+ this . logger . debug ( LOG_SOURCE , LOG_CATEGORY , `Sending ${ method } request:` , id ) ;
168+ this . worker . postMessage ( request ) ;
169+ } ,
170+ ( error ) => {
171+ this . logger . error (
172+ LOG_SOURCE ,
173+ LOG_CATEGORY ,
174+ `Worker init failed, rejecting ${ method } :` ,
175+ error ,
176+ ) ;
177+ task . reject ( {
178+ code : PdfErrorCode . Initialization ,
179+ message : 'Worker initialization failed' ,
180+ } ) ;
181+ } ,
182+ ) ;
161183
162184 return task ;
163185 }
@@ -168,10 +190,10 @@ export class RemoteExecutor implements IPdfExecutor {
168190 private handleMessage = ( event : MessageEvent < WorkerResponse > ) => {
169191 const response = event . data ;
170192
171- // Handle ready response separately
193+ // Handle ready response - resolve the readyTask
172194 if ( response . type === 'ready' ) {
173- this . initialized = true ;
174195 this . logger . debug ( LOG_SOURCE , LOG_CATEGORY , 'Worker is ready' ) ;
196+ this . readyTask . resolve ( true ) ;
175197 return ;
176198 }
177199
@@ -221,10 +243,12 @@ export class RemoteExecutor implements IPdfExecutor {
221243 destroy ( ) : void {
222244 this . worker . removeEventListener ( 'message' , this . handleMessage ) ;
223245
224- // Reject all pending requests
246+ // Reject all pending requests (except readyTask)
225247 this . pendingRequests . forEach ( ( task , id ) => {
226- task . abort ( 'Worker destroyed' ) ;
227- this . logger . debug ( LOG_SOURCE , LOG_CATEGORY , `Aborted pending request: ${ id } ` ) ;
248+ if ( id !== RemoteExecutor . READY_TASK_ID ) {
249+ task . abort ( 'Worker destroyed' ) ;
250+ this . logger . debug ( LOG_SOURCE , LOG_CATEGORY , `Aborted pending request: ${ id } ` ) ;
251+ }
228252 } ) ;
229253 this . pendingRequests . clear ( ) ;
230254
@@ -235,10 +259,7 @@ export class RemoteExecutor implements IPdfExecutor {
235259 // ========== IPdfExecutor Implementation ==========
236260
237261 initialize ( ) : void {
238- if ( this . initialized ) return ;
239- // Initialization is handled by worker creation
240- // We just mark it as initialized here
241- this . initialized = true ;
262+ // Initialization is handled by worker creation via readyTask
242263 this . logger . debug ( LOG_SOURCE , LOG_CATEGORY , 'RemoteExecutor initialized' ) ;
243264 }
244265
0 commit comments