@@ -254,32 +254,6 @@ function isClientRequest(clientRequest: unknown): clientRequest is ClientRequest
254
254
255
255
const cacheableStore = new WeakableMap < string | CacheableRequest . StorageAdapter , CacheableRequestFn > ( ) ;
256
256
257
- const cacheFn = async ( url : URL , options : RequestOptions ) : Promise < ClientRequest | ResponseLike > => new Promise < ClientRequest | ResponseLike > ( ( resolve , reject ) => {
258
- // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed
259
- Object . assign ( options , urlToOptions ( url ) ) ;
260
-
261
- // `http-cache-semantics` checks this
262
- delete ( options as unknown as NormalizedOptions ) . url ;
263
-
264
- // This is ugly
265
- const cacheRequest = cacheableStore . get ( ( options as any ) . cache ) ! ( options , resolve as any ) ;
266
-
267
- // Restore options
268
- ( options as unknown as NormalizedOptions ) . url = url ;
269
-
270
- cacheRequest . once ( 'error' , ( error : Error ) => {
271
- if ( error instanceof CacheableRequest . RequestError ) {
272
- // TODO: `options` should be `normalizedOptions`
273
- reject ( new RequestError ( error . message , error , options as unknown as NormalizedOptions ) ) ;
274
- return ;
275
- }
276
-
277
- // TODO: `options` should be `normalizedOptions`
278
- reject ( new CacheError ( error , options as unknown as NormalizedOptions ) ) ;
279
- } ) ;
280
- cacheRequest . once ( 'request' , resolve ) ;
281
- } ) ;
282
-
283
257
const waitForOpenFile = async ( file : ReadStream ) : Promise < void > => new Promise ( ( resolve , reject ) => {
284
258
const onError = ( error : Error ) : void => {
285
259
reject ( error ) ;
@@ -337,39 +311,36 @@ export class RequestError extends Error {
337
311
readonly request ?: Request ;
338
312
readonly timings ?: Timings ;
339
313
340
- constructor ( message : string , error : Partial < Error & { code ?: string } > , options : NormalizedOptions , requestOrResponse ?: Request | Response ) {
314
+ constructor ( message : string , error : Partial < Error & { code ?: string } > , self : Request | NormalizedOptions ) {
341
315
super ( message ) ;
342
316
Error . captureStackTrace ( this , this . constructor ) ;
343
317
344
318
this . name = 'RequestError' ;
345
319
this . code = error . code ;
346
320
347
- Object . defineProperty ( this , 'options' , {
348
- // This fails because of TS 3.7.2 useDefineForClassFields
349
- // Ref: https://github.com/microsoft/TypeScript/issues/34972
350
- enumerable : false ,
351
- value : options
352
- } ) ;
353
-
354
- if ( requestOrResponse instanceof IncomingMessage ) {
355
- Object . defineProperty ( this , 'response' , {
321
+ if ( self instanceof Request ) {
322
+ Object . defineProperty ( this , 'request' , {
356
323
enumerable : false ,
357
- value : requestOrResponse
324
+ value : self
358
325
} ) ;
359
326
360
- Object . defineProperty ( this , 'request ' , {
327
+ Object . defineProperty ( this , 'response ' , {
361
328
enumerable : false ,
362
- value : requestOrResponse . request
329
+ value : self [ kResponse ]
363
330
} ) ;
364
- } else if ( requestOrResponse instanceof Request ) {
365
- Object . defineProperty ( this , 'request' , {
331
+
332
+ Object . defineProperty ( this , 'options' , {
333
+ // This fails because of TS 3.7.2 useDefineForClassFields
334
+ // Ref: https://github.com/microsoft/TypeScript/issues/34972
366
335
enumerable : false ,
367
- value : requestOrResponse
336
+ value : self . options
368
337
} ) ;
369
-
370
- Object . defineProperty ( this , 'response' , {
338
+ } else {
339
+ Object . defineProperty ( this , 'options' , {
340
+ // This fails because of TS 3.7.2 useDefineForClassFields
341
+ // Ref: https://github.com/microsoft/TypeScript/issues/34972
371
342
enumerable : false ,
372
- value : requestOrResponse [ kResponse ]
343
+ value : self
373
344
} ) ;
374
345
}
375
346
@@ -394,41 +365,31 @@ export class RequestError extends Error {
394
365
export class MaxRedirectsError extends RequestError {
395
366
declare readonly response : Response ;
396
367
397
- constructor ( response : Response , maxRedirects : number , options : NormalizedOptions ) {
398
- super ( `Redirected ${ maxRedirects } times. Aborting.` , { } , options ) ;
368
+ constructor ( request : Request ) {
369
+ super ( `Redirected ${ request . options . maxRedirects } times. Aborting.` , { } , request ) ;
399
370
this . name = 'MaxRedirectsError' ;
400
-
401
- Object . defineProperty ( this , 'response' , {
402
- enumerable : false ,
403
- value : response
404
- } ) ;
405
371
}
406
372
}
407
373
408
374
export class HTTPError extends RequestError {
409
375
declare readonly response : Response ;
410
376
411
- constructor ( response : Response , options : NormalizedOptions ) {
412
- super ( `Response code ${ response . statusCode } (${ response . statusMessage ! } )` , { } , options ) ;
377
+ constructor ( response : Response ) {
378
+ super ( `Response code ${ response . statusCode } (${ response . statusMessage ! } )` , { } , response . request ) ;
413
379
this . name = 'HTTPError' ;
414
-
415
- Object . defineProperty ( this , 'response' , {
416
- enumerable : false ,
417
- value : response
418
- } ) ;
419
380
}
420
381
}
421
382
422
383
export class CacheError extends RequestError {
423
- constructor ( error : Error , options : NormalizedOptions ) {
424
- super ( error . message , error , options ) ;
384
+ constructor ( error : Error , request : Request ) {
385
+ super ( error . message , error , request ) ;
425
386
this . name = 'CacheError' ;
426
387
}
427
388
}
428
389
429
390
export class UploadError extends RequestError {
430
- constructor ( error : Error , options : NormalizedOptions , request : Request ) {
431
- super ( error . message , error , options , request ) ;
391
+ constructor ( error : Error , request : Request ) {
392
+ super ( error . message , error , request ) ;
432
393
this . name = 'UploadError' ;
433
394
}
434
395
}
@@ -437,17 +398,17 @@ export class TimeoutError extends RequestError {
437
398
readonly timings : Timings ;
438
399
readonly event : string ;
439
400
440
- constructor ( error : TimedOutTimeoutError , timings : Timings , options : NormalizedOptions ) {
441
- super ( error . message , error , options ) ;
401
+ constructor ( error : TimedOutTimeoutError , timings : Timings , request : Request ) {
402
+ super ( error . message , error , request ) ;
442
403
this . name = 'TimeoutError' ;
443
404
this . event = error . event ;
444
405
this . timings = timings ;
445
406
}
446
407
}
447
408
448
409
export class ReadError extends RequestError {
449
- constructor ( error : Error , options : NormalizedOptions , response : Response ) {
450
- super ( error . message , error , options , response ) ;
410
+ constructor ( error : Error , request : Request ) {
411
+ super ( error . message , error , request ) ;
451
412
this . name = 'ReadError' ;
452
413
}
453
414
}
@@ -982,7 +943,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
982
943
} ) ;
983
944
984
945
response . on ( 'error' , ( error : Error ) => {
985
- this . _beforeError ( new ReadError ( error , options , response as Response ) ) ;
946
+ this . _beforeError ( new ReadError ( error , this ) ) ;
986
947
} ) ;
987
948
988
949
response . once ( 'aborted' , ( ) => {
@@ -993,7 +954,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
993
954
this . _beforeError ( new ReadError ( {
994
955
name : 'Error' ,
995
956
message : 'The server aborted the pending request'
996
- } , options , response as Response ) ) ;
957
+ } , this ) ) ;
997
958
} ) ;
998
959
999
960
this . emit ( 'downloadProgress' , this . downloadProgress ) ;
@@ -1048,7 +1009,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1048
1009
}
1049
1010
1050
1011
if ( this . redirects . length >= options . maxRedirects ) {
1051
- this . _beforeError ( new MaxRedirectsError ( typedResponse , options . maxRedirects , options ) ) ;
1012
+ this . _beforeError ( new MaxRedirectsError ( this ) ) ;
1052
1013
return ;
1053
1014
}
1054
1015
@@ -1097,7 +1058,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1097
1058
const limitStatusCode = options . followRedirect ? 299 : 399 ;
1098
1059
const isOk = ( statusCode >= 200 && statusCode <= limitStatusCode ) || statusCode === 304 ;
1099
1060
if ( options . throwHttpErrors && ! isOk ) {
1100
- await this . _beforeError ( new HTTPError ( typedResponse , options ) ) ;
1061
+ await this . _beforeError ( new HTTPError ( typedResponse ) ) ;
1101
1062
1102
1063
if ( this . destroyed ) {
1103
1064
return ;
@@ -1157,9 +1118,9 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1157
1118
1158
1119
request . once ( 'error' , ( error : Error ) => {
1159
1120
if ( error instanceof TimedOutTimeoutError ) {
1160
- error = new TimeoutError ( error , this . timings ! , options ) ;
1121
+ error = new TimeoutError ( error , this . timings ! , this ) ;
1161
1122
} else {
1162
- error = new RequestError ( error . message , error , options , this ) ;
1123
+ error = new RequestError ( error . message , error , this ) ;
1163
1124
}
1164
1125
1165
1126
this . _beforeError ( error as RequestError ) ;
@@ -1176,7 +1137,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1176
1137
if ( is . nodeStream ( options . body ) ) {
1177
1138
options . body . pipe ( currentRequest ) ;
1178
1139
options . body . once ( 'error' , ( error : NodeJS . ErrnoException ) => {
1179
- this . _beforeError ( new UploadError ( error , options , this ) ) ;
1140
+ this . _beforeError ( new UploadError ( error , this ) ) ;
1180
1141
} ) ;
1181
1142
1182
1143
options . body . once ( 'end' , ( ) => {
@@ -1200,6 +1161,34 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1200
1161
this . emit ( 'request' , request ) ;
1201
1162
}
1202
1163
1164
+ async _createCacheableRequest ( url : URL , options : RequestOptions ) : Promise < ClientRequest | ResponseLike > {
1165
+ return new Promise < ClientRequest | ResponseLike > ( ( resolve , reject ) => {
1166
+ // TODO: Remove `utils/url-to-options.ts` when `cacheable-request` is fixed
1167
+ Object . assign ( options , urlToOptions ( url ) ) ;
1168
+
1169
+ // `http-cache-semantics` checks this
1170
+ delete ( options as unknown as NormalizedOptions ) . url ;
1171
+
1172
+ // This is ugly
1173
+ const cacheRequest = cacheableStore . get ( ( options as any ) . cache ) ! ( options , resolve as any ) ;
1174
+
1175
+ // Restore options
1176
+ ( options as unknown as NormalizedOptions ) . url = url ;
1177
+
1178
+ cacheRequest . once ( 'error' , ( error : Error ) => {
1179
+ if ( error instanceof CacheableRequest . RequestError ) {
1180
+ // TODO: `options` should be `normalizedOptions`
1181
+ reject ( new RequestError ( error . message , error , this ) ) ;
1182
+ return ;
1183
+ }
1184
+
1185
+ // TODO: `options` should be `normalizedOptions`
1186
+ reject ( new CacheError ( error , this ) ) ;
1187
+ } ) ;
1188
+ cacheRequest . once ( 'request' , resolve ) ;
1189
+ } ) ;
1190
+ }
1191
+
1203
1192
async _makeRequest ( ) : Promise < void > {
1204
1193
const { options} = this ;
1205
1194
const { url, headers, request, agent, timeout} = options ;
@@ -1266,7 +1255,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1266
1255
}
1267
1256
1268
1257
const realFn = options . request ?? fallbackFn ;
1269
- const fn = options . cache ? cacheFn : realFn ;
1258
+ const fn = options . cache ? this . _createCacheableRequest . bind ( this ) : realFn ;
1270
1259
1271
1260
if ( agent && ! options . http2 ) {
1272
1261
( options as unknown as RequestOptions ) . agent = agent [ isHttps ? 'https' : 'http' ] ;
@@ -1310,15 +1299,15 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1310
1299
throw error ;
1311
1300
}
1312
1301
1313
- throw new RequestError ( error . message , error , options , this ) ;
1302
+ throw new RequestError ( error . message , error , this ) ;
1314
1303
}
1315
1304
}
1316
1305
1317
1306
async _beforeError ( error : Error ) : Promise < void > {
1318
1307
this [ kStopReading ] = true ;
1319
1308
1320
1309
if ( ! ( error instanceof RequestError ) ) {
1321
- error = new RequestError ( error . message , error , this . options , this ) ;
1310
+ error = new RequestError ( error . message , error , this ) ;
1322
1311
}
1323
1312
1324
1313
try {
@@ -1338,7 +1327,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1338
1327
error = await hook ( error as RequestError ) ;
1339
1328
}
1340
1329
} catch ( error_ ) {
1341
- error = new RequestError ( error_ . message , error_ , this . options , this ) ;
1330
+ error = new RequestError ( error_ . message , error_ , this ) ;
1342
1331
}
1343
1332
1344
1333
this . destroy ( error ) ;
@@ -1451,7 +1440,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
1451
1440
}
1452
1441
1453
1442
if ( error !== null && ! is . undefined ( error ) && ! ( error instanceof RequestError ) ) {
1454
- error = new RequestError ( error . message , error , this . options , this ) ;
1443
+ error = new RequestError ( error . message , error , this ) ;
1455
1444
}
1456
1445
1457
1446
callback ( error ) ;
0 commit comments