@@ -36,12 +36,11 @@ import { FormData } from './FormData.js';
3636import { HttpAgent , CheckAddressFunction } from './HttpAgent.js' ;
3737import type { IncomingHttpHeaders } from './IncomingHttpHeaders.js' ;
3838import { RequestURL , RequestOptions , HttpMethod , RequestMeta } from './Request.js' ;
39- import { RawResponseWithMeta , HttpClientResponse , SocketInfo } from './Response.js' ;
39+ import { RawResponseWithMeta , HttpClientResponse , SocketInfo , InternalStore } from './Response.js' ;
4040import { parseJSON , digestAuthHeader , globalId , performanceTime , isReadable , updateSocketInfo } from './utils.js' ;
41- import symbols from './symbols.js' ;
4241import { initDiagnosticsChannel } from './diagnosticsChannel.js' ;
4342import { HttpClientConnectTimeoutError , HttpClientRequestTimeoutError } from './HttpClientError.js' ;
44- import { asyncLocalStorage } from './asyncLocalStorage2 .js' ;
43+ import { asyncLocalStorage } from './asyncLocalStorage .js' ;
4544
4645type Exists < T > = T extends undefined ? never : T ;
4746type UndiciRequestOption = Exists < Parameters < typeof undiciRequest > [ 1 ] > ;
@@ -137,7 +136,6 @@ function defaultIsRetry(response: HttpClientResponse) {
137136export type RequestContext = {
138137 retries : number ;
139138 socketErrorRetries : number ;
140- requestStartTime ?: number ;
141139 redirects : number ;
142140 history : string [ ] ;
143141} ;
@@ -247,7 +245,16 @@ export class HttpClient extends EventEmitter {
247245 }
248246
249247 async request < T = any > ( url : RequestURL , options ?: RequestOptions ) {
250- return await this . #requestInternal< T > ( url , options ) ;
248+ // using opaque to diagnostics channel, binding request and socket
249+ const requestId = globalId ( 'HttpClientRequest' ) ;
250+ const internalStore = {
251+ requestId,
252+ requestStartTime : performance . now ( ) ,
253+ enableRequestTiming : ! ! options ?. timing ,
254+ } as InternalStore ;
255+ return await asyncLocalStorage . run ( internalStore , async ( ) => {
256+ return await this . #requestInternal< T > ( url , options ) ;
257+ } ) ;
251258 }
252259
253260 // alias to request, keep compatible with urllib@2 HttpClient.curl
@@ -259,12 +266,12 @@ export class HttpClient extends EventEmitter {
259266 return [
260267 ( dispatch : any ) => {
261268 return function dnsAfterInterceptor ( options : any , handler : any ) {
262- const opaque = options . opaque ;
263- if ( opaque ?. [ symbols . kEnableRequestTiming ] ) {
264- const dnslookup = opaque [ symbols . kRequestTiming ] . dnslookup =
265- performanceTime ( opaque [ symbols . kRequestStartTime ] ) ;
269+ const store = asyncLocalStorage . getStore ( ) ;
270+ if ( store ?. enableRequestTiming ) {
271+ const dnslookup = store . requestTiming . dnslookup =
272+ performanceTime ( store . requestStartTime ) ;
266273 debug ( 'Request#%d dns lookup %sms, servername: %s, origin: %s' ,
267- opaque [ symbols . kRequestId ] , dnslookup , options . servername , options . origin ) ;
274+ store . requestId , dnslookup , options . servername , options . origin ) ;
268275 }
269276 return dispatch ( options , handler ) ;
270277 } ;
@@ -274,7 +281,6 @@ export class HttpClient extends EventEmitter {
274281 }
275282
276283 async #requestInternal< T > ( url : RequestURL , options ?: RequestOptions , requestContext ?: RequestContext ) : Promise < HttpClientResponse < T > > {
277- const requestId = globalId ( 'HttpClientRequest' ) ;
278284 let requestUrl : URL ;
279285 if ( typeof url === 'string' ) {
280286 if ( ! PROTO_RE . test ( url ) ) {
@@ -298,7 +304,6 @@ export class HttpClient extends EventEmitter {
298304 const args = {
299305 retry : 0 ,
300306 socketErrorRetry : 1 ,
301- timing : true ,
302307 ...this . #defaultArgs,
303308 ...options ,
304309 // keep method and headers exists on args for request event handler to easy use
@@ -312,12 +317,11 @@ export class HttpClient extends EventEmitter {
312317 history : [ ] ,
313318 ...requestContext ,
314319 } ;
315- if ( ! requestContext . requestStartTime ) {
316- requestContext . requestStartTime = performance . now ( ) ;
317- }
318320 requestContext . history . push ( requestUrl . href ) ;
319- const requestStartTime = requestContext . requestStartTime ;
320321
322+ const internalStore = asyncLocalStorage . getStore ( ) ! ;
323+ const requestStartTime = internalStore . requestStartTime ;
324+ const requestId = internalStore . requestId ;
321325 // https://developer.chrome.com/docs/devtools/network/reference/?utm_source=devtools#timing-explanation
322326 const timing = {
323327 // socket assigned
@@ -335,15 +339,9 @@ export class HttpClient extends EventEmitter {
335339 // the response body and trailers have been received
336340 contentDownload : 0 ,
337341 } ;
342+ internalStore . requestTiming = timing ;
343+ internalStore . enableRequestTiming = ! ! args . timing ;
338344 const originalOpaque = args . opaque ;
339- // using opaque to diagnostics channel, binding request and socket
340- const internalOpaque = {
341- [ symbols . kRequestId ] : requestId ,
342- [ symbols . kRequestStartTime ] : requestStartTime ,
343- [ symbols . kEnableRequestTiming ] : ! ! args . timing ,
344- [ symbols . kRequestTiming ] : timing ,
345- [ symbols . kRequestOriginalOpaque ] : originalOpaque ,
346- } ;
347345 const reqMeta = {
348346 requestId,
349347 url : requestUrl . href ,
@@ -447,7 +445,7 @@ export class HttpClient extends EventEmitter {
447445 headersTimeout,
448446 headers,
449447 bodyTimeout,
450- opaque : internalOpaque ,
448+ opaque : originalOpaque ,
451449 dispatcher : args . dispatcher ?? this . #dispatcher,
452450 signal : args . signal ,
453451 } ;
@@ -592,7 +590,9 @@ export class HttpClient extends EventEmitter {
592590 }
593591
594592 debug ( 'Request#%d %s %s, headers: %j, headersTimeout: %s, bodyTimeout: %s, isStreamingRequest: %s, isStreamingResponse: %s, maxRedirections: %s, redirects: %s' ,
595- requestId , requestOptions . method , requestUrl . href , headers , headersTimeout , bodyTimeout , isStreamingRequest , isStreamingResponse , maxRedirects , requestContext . redirects ) ;
593+ requestId , requestOptions . method , requestUrl . href , headers ,
594+ headersTimeout , bodyTimeout , isStreamingRequest , isStreamingResponse ,
595+ maxRedirects , requestContext . redirects ) ;
596596 requestOptions . headers = headers ;
597597 channels . request . publish ( {
598598 request : reqMeta ,
@@ -601,7 +601,7 @@ export class HttpClient extends EventEmitter {
601601 this . emit ( 'request' , reqMeta ) ;
602602 }
603603
604- let response = await this . # undiciRequest( internalOpaque , requestUrl , requestOptions as UndiciRequestOption ) ;
604+ let response = await undiciRequest ( requestUrl , requestOptions as UndiciRequestOption ) ;
605605 if ( response . statusCode === 401
606606 && ( response . headers [ 'www-authenticate' ] || response . headers [ 'x-www-authenticate' ] )
607607 && ! requestOptions . headers . authorization
@@ -622,7 +622,7 @@ export class HttpClient extends EventEmitter {
622622 }
623623 // Ensure the previous response is consumed as we re-use the same variable
624624 await response . body . arrayBuffer ( ) ;
625- response = await this . # undiciRequest( internalOpaque , requestUrl , requestOptions as UndiciRequestOption ) ;
625+ response = await undiciRequest ( requestUrl , requestOptions as UndiciRequestOption ) ;
626626 }
627627 }
628628 const contentEncoding = response . headers [ 'content-encoding' ] ;
@@ -690,7 +690,7 @@ export class HttpClient extends EventEmitter {
690690 }
691691 res . rt = performanceTime ( requestStartTime ) ;
692692 // get real socket info from internalOpaque
693- updateSocketInfo ( socketInfo , internalOpaque ) ;
693+ updateSocketInfo ( socketInfo , internalStore ) ;
694694
695695 const clientResponse : HttpClientResponse = {
696696 opaque : originalOpaque ,
@@ -738,7 +738,7 @@ export class HttpClient extends EventEmitter {
738738
739739 return clientResponse ;
740740 } catch ( rawError : any ) {
741- updateSocketInfo ( socketInfo , internalOpaque , rawError ) ;
741+ updateSocketInfo ( socketInfo , internalStore , rawError ) ;
742742 debug ( 'Request#%d throw error: %s, socketErrorRetry: %s, socketErrorRetries: %s, socket: %j' ,
743743 requestId , rawError , args . socketErrorRetry , requestContext . socketErrorRetries , socketInfo ) ;
744744 let err = rawError ;
@@ -790,10 +790,4 @@ export class HttpClient extends EventEmitter {
790790 throw err ;
791791 }
792792 }
793-
794- async #undiciRequest( internalOpaque : unknown , requestUrl : URL , requestOptions : UndiciRequestOption ) {
795- return await asyncLocalStorage . run ( internalOpaque , async ( ) => {
796- return await undiciRequest ( requestUrl , requestOptions ) ;
797- } ) ;
798- }
799793}
0 commit comments