@@ -29,6 +29,7 @@ import {
29
29
PARTITION_FORM_FILES_KEY ,
30
30
PARTITION_FORM_SPLIT_PDF_PAGE_KEY ,
31
31
} from "./common.js" ;
32
+ import { retry , RetryConfig } from "../../lib/retries" ;
32
33
33
34
/**
34
35
* Represents a hook for splitting and sending PDF files as per page requests.
@@ -178,9 +179,11 @@ export class SplitPdfHook
178
179
file . name ,
179
180
firstPageNumber
180
181
) ;
182
+ const timeoutInMs = 60 * 10 * 1000 ;
181
183
const req = new Request ( requestClone , {
182
184
headers,
183
185
body,
186
+ signal : AbortSignal . timeout ( timeoutInMs )
184
187
} ) ;
185
188
requests . push ( req ) ;
186
189
setIndex += 1 ;
@@ -190,11 +193,19 @@ export class SplitPdfHook
190
193
191
194
const allowFailed = this . allowFailed ;
192
195
196
+ const retryConfig = { strategy : "backoff" } as RetryConfig ;
197
+ const retryCodes = [ "502" , "503" , "504" ] ;
198
+
193
199
this . partitionRequests [ operationID ] = async . parallelLimit (
194
- requests . slice ( 0 , - 1 ) . map ( ( req , pageIndex ) => async ( ) => {
200
+ requests . map ( ( req , pageIndex ) => async ( ) => {
195
201
const pageNumber = pageIndex + startingPageNumber ;
196
202
try {
197
- const response = await this . client ! . request ( req ) ;
203
+ const response = await retry (
204
+ async ( ) => {
205
+ return await this . client ! . request ( req . clone ( ) ) ;
206
+ } ,
207
+ { config : retryConfig , statusCodes : retryCodes }
208
+ ) ;
198
209
if ( response . status === 200 ) {
199
210
( this . partitionSuccessfulResponses [ operationID ] as Response [ ] ) [ pageIndex ] =
200
211
response . clone ( ) ;
@@ -206,7 +217,7 @@ export class SplitPdfHook
206
217
}
207
218
}
208
219
} catch ( e ) {
209
- console . error ( `Failed to send request for page ${ pageNumber } .` ) ;
220
+ console . error ( `Failed to send request for page ${ pageNumber } .` , e ) ;
210
221
if ( ! allowFailed ) {
211
222
throw e ;
212
223
}
@@ -215,7 +226,9 @@ export class SplitPdfHook
215
226
concurrencyLevel
216
227
) ;
217
228
218
- return requests . at ( - 1 ) as Request ;
229
+ const dummyRequest = new Request ( "https://no-op/" ) ;
230
+ await this . client ! . request ( dummyRequest ) ;
231
+ return dummyRequest ;
219
232
}
220
233
221
234
/**
@@ -230,28 +243,39 @@ export class SplitPdfHook
230
243
successfulResponses : Response [ ] ,
231
244
failedResponses : Response [ ]
232
245
) : Promise < Response > {
246
+ let realResponse = response . clone ( ) ;
247
+ const firstSuccessfulResponse = successfulResponses . at ( 0 ) ;
248
+ const isFakeResponse = response . headers . has ( "fake-response" ) ;
249
+ if ( firstSuccessfulResponse !== undefined && isFakeResponse ) {
250
+ realResponse = firstSuccessfulResponse . clone ( ) ;
251
+ }
252
+
233
253
let responseBody , responseStatus , responseStatusText ;
234
254
const numFailedResponses = failedResponses ?. length ?? 0 ;
235
- const headers = prepareResponseHeaders ( response ) ;
255
+ const headers = prepareResponseHeaders ( realResponse ) ;
236
256
237
257
if ( ! this . allowFailed && failedResponses && failedResponses . length > 0 ) {
238
258
const failedResponse = failedResponses [ 0 ] ?. clone ( ) ;
239
259
if ( failedResponse ) {
240
260
responseBody = await failedResponse . text ( ) ;
241
- responseStatus = failedResponse . status ;
242
261
responseStatusText = failedResponse . statusText ;
243
262
} else {
244
263
responseBody = JSON . stringify ( { "details:" : "Unknown error" } ) ;
245
- responseStatus = 503
246
264
responseStatusText = "Unknown error"
247
265
}
266
+ // if the response status is unknown or was 502, 503, 504, set back to 500 to ensure we don't cause more retries
267
+ responseStatus = 500 ;
248
268
console . warn (
249
269
`${ numFailedResponses } requests failed. The partition operation is cancelled.`
250
270
) ;
251
271
} else {
252
- responseBody = await prepareResponseBody ( [ ...successfulResponses , response ] ) ;
253
- responseStatus = response . status
254
- responseStatusText = response . statusText
272
+ if ( isFakeResponse ) {
273
+ responseBody = await prepareResponseBody ( [ ...successfulResponses ] ) ;
274
+ } else {
275
+ responseBody = await prepareResponseBody ( [ ...successfulResponses , response ] ) ;
276
+ }
277
+ responseStatus = realResponse . status
278
+ responseStatusText = realResponse . statusText
255
279
if ( numFailedResponses > 0 ) {
256
280
console . warn (
257
281
`${ numFailedResponses } requests failed. The results might miss some pages.`
0 commit comments