@@ -18,6 +18,8 @@ import type {
1818} from 'react-devtools-shared/src/types' ;
1919import type { HookSource } from 'react-debug-tools/src/ReactDebugHooks' ;
2020import type { FetchFileWithCaching } from 'react-devtools-shared/src/devtools/views/Components/FetchFileWithCachingContext' ;
21+ import { withCallbackPerfMeasurements } from './PerformanceLoggingUtils' ;
22+ import { logEvent } from './Logger' ;
2123
2224const TIMEOUT = 30000 ;
2325
@@ -92,6 +94,11 @@ export function loadHookNames(
9294 } ,
9395 } ;
9496
97+ let timeoutID ;
98+ let didTimeout = false ;
99+ let resolution = 'unknown' ;
100+ let resolvedHookNames : HookNames | null = null ;
101+
95102 const wake = ( ) => {
96103 if ( timeoutID ) {
97104 clearTimeout ( timeoutID ) ;
@@ -103,71 +110,92 @@ export function loadHookNames(
103110 callbacks . clear ( ) ;
104111 } ;
105112
113+ const handleLoadComplete = ( durationMs : number ) : void => {
114+ // Log duration for parsing hook names
115+ logEvent ( {
116+ name : 'loadHookNames' ,
117+ displayName : element . displayName ,
118+ numberOfHooks : resolvedHookNames ?. size ?? null ,
119+ durationMs,
120+ resolution,
121+ } ) ;
122+ } ;
123+
106124 const newRecord : Record < HookNames > = ( record = {
107125 status : Pending ,
108126 value : wakeable ,
109127 } ) ;
110128
111- let didTimeout = false ;
112-
113- loadHookNamesFunction ( hooksTree , fetchFileWithCaching ) . then (
114- function onSuccess ( hookNames ) {
115- if ( didTimeout ) {
116- return ;
117- }
118-
119- if ( __DEBUG__ ) {
120- console . log ( '[hookNamesCache] onSuccess() hookNames:' , hookNames ) ;
121- }
122-
123- if ( hookNames ) {
124- const resolvedRecord = ( ( newRecord : any ) : ResolvedRecord < HookNames > ) ;
125- resolvedRecord . status = Resolved ;
126- resolvedRecord . value = hookNames ;
127- } else {
128- const notFoundRecord = ( ( newRecord : any ) : RejectedRecord ) ;
129- notFoundRecord . status = Rejected ;
130- notFoundRecord . value = null ;
131- }
132-
133- wake ( ) ;
134- } ,
135- function onError ( error ) {
136- if ( didTimeout ) {
137- return ;
138- }
139-
140- if ( __DEBUG__ ) {
141- console . log ( '[hookNamesCache] onError()' ) ;
142- }
143-
144- console . error ( error ) ;
145-
146- const thrownRecord = ( ( newRecord : any ) : RejectedRecord ) ;
147- thrownRecord . status = Rejected ;
148- thrownRecord . value = null ;
149-
150- wake ( ) ;
129+ withCallbackPerfMeasurements (
130+ 'loadHookNames' ,
131+ done => {
132+ loadHookNamesFunction ( hooksTree , fetchFileWithCaching ) . then (
133+ function onSuccess ( hookNames ) {
134+ if ( didTimeout ) {
135+ return ;
136+ }
137+
138+ if ( __DEBUG__ ) {
139+ console . log ( '[hookNamesCache] onSuccess() hookNames:' , hookNames ) ;
140+ }
141+
142+ if ( hookNames ) {
143+ const resolvedRecord = ( ( newRecord : any ) : ResolvedRecord < HookNames > ) ;
144+ resolvedRecord . status = Resolved ;
145+ resolvedRecord . value = hookNames ;
146+ } else {
147+ const notFoundRecord = ( ( newRecord : any ) : RejectedRecord ) ;
148+ notFoundRecord . status = Rejected ;
149+ notFoundRecord . value = null ;
150+ }
151+
152+ resolution = 'success' ;
153+ resolvedHookNames = hookNames ;
154+ done ( ) ;
155+ wake ( ) ;
156+ } ,
157+ function onError ( error ) {
158+ if ( didTimeout ) {
159+ return ;
160+ }
161+
162+ if ( __DEBUG__ ) {
163+ console . log ( '[hookNamesCache] onError()' ) ;
164+ }
165+
166+ console . error ( error ) ;
167+
168+ const thrownRecord = ( ( newRecord : any ) : RejectedRecord ) ;
169+ thrownRecord . status = Rejected ;
170+ thrownRecord . value = null ;
171+
172+ resolution = 'error' ;
173+ done ( ) ;
174+ wake ( ) ;
175+ } ,
176+ ) ;
177+
178+ // Eventually timeout and stop trying to load names.
179+ timeoutID = setTimeout ( function onTimeout ( ) {
180+ if ( __DEBUG__ ) {
181+ console . log ( '[hookNamesCache] onTimeout()' ) ;
182+ }
183+
184+ timeoutID = null ;
185+
186+ didTimeout = true ;
187+
188+ const timedoutRecord = ( ( newRecord : any ) : RejectedRecord ) ;
189+ timedoutRecord . status = Rejected ;
190+ timedoutRecord . value = null ;
191+
192+ resolution = 'timeout' ;
193+ done ( ) ;
194+ wake ( ) ;
195+ } , TIMEOUT ) ;
151196 } ,
197+ handleLoadComplete ,
152198 ) ;
153-
154- // Eventually timeout and stop trying to load names.
155- let timeoutID = setTimeout ( function onTimeout ( ) {
156- if ( __DEBUG__ ) {
157- console . log ( '[hookNamesCache] onTimeout()' ) ;
158- }
159-
160- timeoutID = null ;
161-
162- didTimeout = true ;
163-
164- const timedoutRecord = ( ( newRecord : any ) : RejectedRecord ) ;
165- timedoutRecord . status = Rejected ;
166- timedoutRecord . value = null ;
167-
168- wake ( ) ;
169- } , TIMEOUT ) ;
170-
171199 map . set ( element , record ) ;
172200 }
173201
0 commit comments