@@ -53,56 +53,11 @@ export class WaterCrawlAPIClient extends BaseAPIClient {
5353 }
5454
5555 async * monitorCrawlRequest ( itemId : string , download : boolean = true ) : AsyncGenerator < CrawlEvent , void , unknown > {
56- const events : CrawlEvent [ ] = [ ] ;
57- let resolveNext : ( ( value : IteratorResult < CrawlEvent , void > ) => void ) | null = null ;
58- let isDone = false ;
59- let streamError : Error | null = null ;
6056
61- const processEvent = ( event : CrawlEvent ) => {
62- if ( resolveNext ) {
63- resolveNext ( { value : event , done : false } ) ;
64- resolveNext = null ;
65- } else {
66- events . push ( event ) ;
67- }
68- } ;
69-
70- const streamPromise = this . streamEvents (
57+ yield * this . fetchStream < CrawlEvent > (
7158 `/api/v1/core/crawl-requests/${ itemId } /status/` ,
72- processEvent ,
7359 { params : { prefetched : download } }
74- ) . catch ( ( error ) => {
75- streamError = error ;
76- isDone = true ;
77- } ) . finally ( ( ) => {
78- isDone = true ;
79- } ) ;
80-
81-
82- try {
83- while ( ! isDone || events . length > 0 ) {
84- if ( events . length > 0 ) {
85- yield events . shift ( ) ! ;
86- } else if ( ! isDone ) {
87- await new Promise < IteratorResult < CrawlEvent , void > > ( ( resolve ) => {
88- resolveNext = resolve ;
89- } ) ;
90- }
91- }
92-
93- // Check for any remaining events after the stream ends
94- while ( events . length > 0 ) {
95- yield events . shift ( ) ! ;
96- }
97-
98- // If the stream failed, propagate the error
99- if ( streamError ) {
100- throw streamError ;
101- }
102- } finally {
103- // Ensure the stream is awaited and cleaned up properly
104- await streamPromise ;
105- }
60+ ) ;
10661 }
10762
10863 async getCrawlRequestResults ( itemId : string ) : Promise < { results : CrawlResult [ ] } > {
@@ -148,14 +103,14 @@ export class WaterCrawlAPIClient extends BaseAPIClient {
148103 * @throws Error if the sitemap is not available
149104 */
150105 private async getCrawlRequestForSitemap ( crawlRequest : string | CrawlRequest ) : Promise < CrawlRequest > {
151- const request = typeof crawlRequest === 'string'
152- ? await this . getCrawlRequest ( crawlRequest )
106+ const request = typeof crawlRequest === 'string'
107+ ? await this . getCrawlRequest ( crawlRequest )
153108 : crawlRequest ;
154-
109+
155110 if ( ! request . sitemap ) {
156111 throw new Error ( 'Sitemap not found in crawl request' ) ;
157112 }
158-
113+
159114 return request ;
160115 }
161116
@@ -166,11 +121,11 @@ export class WaterCrawlAPIClient extends BaseAPIClient {
166121 */
167122 async downloadSitemap ( crawlRequest : string | CrawlRequest ) : Promise < SitemapNode [ ] > {
168123 const request = await this . getCrawlRequestForSitemap ( crawlRequest ) ;
169-
124+
170125 if ( ! request . sitemap ) {
171126 throw new Error ( 'Sitemap URL is missing or undefined' ) ;
172127 }
173-
128+
174129 const response = await axios . get ( request . sitemap ) ;
175130 return response . data ;
176131 }
@@ -237,23 +192,23 @@ export class WaterCrawlAPIClient extends BaseAPIClient {
237192 search_options : searchOptions ,
238193 result_limit : resultLimit
239194 } ;
240-
195+
241196 const response = await this . post < SearchRequest > ( '/api/v1/core/search/' , request ) ;
242-
197+
243198 if ( ! sync ) {
244199 return response ;
245200 }
246-
201+
247202 // Monitor the search request until completion
248203 for await ( const event of this . monitorSearchRequest ( response . uuid , download ) ) {
249- if ( event . type === 'state' && [ 'finished' , 'failed' ] . includes ( event . status ) ) {
204+ if ( event . type === 'state' && [ 'finished' , 'failed' ] . includes ( event . data . status ) ) {
250205 if ( download && Array . isArray ( event . data . result ) ) {
251206 return event . data . result as SearchResult [ ] ;
252207 }
253208 return event . data ;
254209 }
255210 }
256-
211+
257212 throw new Error ( 'Search request failed or timed out' ) ;
258213 }
259214
@@ -264,55 +219,10 @@ export class WaterCrawlAPIClient extends BaseAPIClient {
264219 * @returns AsyncGenerator yielding search events
265220 */
266221 async * monitorSearchRequest ( itemId : string , download : boolean = true ) : AsyncGenerator < SearchEvent , void , unknown > {
267- const events : SearchEvent [ ] = [ ] ;
268- let resolveNext : ( ( value : IteratorResult < SearchEvent , void > ) => void ) | null = null ;
269- let isDone = false ;
270- let streamError : Error | null = null ;
271-
272- const processEvent = ( event : SearchEvent ) => {
273- if ( resolveNext ) {
274- resolveNext ( { value : event , done : false } ) ;
275- resolveNext = null ;
276- } else {
277- events . push ( event ) ;
278- }
279- } ;
280-
281- const streamPromise = this . streamEvents (
282- `/api/v1/core/search/${ itemId } /status/` ,
283- processEvent ,
284- { params : { prefetched : download } }
285- ) . catch ( ( error ) => {
286- streamError = error ;
287- isDone = true ;
288- } ) . finally ( ( ) => {
289- isDone = true ;
290- } ) ;
291-
292- try {
293- while ( ! isDone || events . length > 0 ) {
294- if ( events . length > 0 ) {
295- yield events . shift ( ) ! ;
296- } else if ( ! isDone ) {
297- await new Promise < IteratorResult < SearchEvent , void > > ( ( resolve ) => {
298- resolveNext = resolve ;
299- } ) ;
300- }
301- }
302-
303- // Check for any remaining events after the stream ends
304- while ( events . length > 0 ) {
305- yield events . shift ( ) ! ;
306- }
307-
308- // If the stream failed, propagate the error
309- if ( streamError ) {
310- throw streamError ;
311- }
312- } finally {
313- // Ensure the stream is awaited and cleaned up properly
314- await streamPromise ;
315- }
222+ yield * this . fetchStream < SearchEvent > (
223+ `/api/v1/core/search/${ itemId } /status/` ,
224+ { params : { prefetched : download } }
225+ ) ;
316226 }
317227
318228 /**
0 commit comments