diff --git a/src/stores/createFirebaseTraceSlice.ts b/src/stores/createFirebaseTraceSlice.ts index dddb8969d..8083ea298 100644 --- a/src/stores/createFirebaseTraceSlice.ts +++ b/src/stores/createFirebaseTraceSlice.ts @@ -5,10 +5,17 @@ export enum FIREBASE_TRACES { AI_CAMERA_TO_MATCH = "ai_camera_to_match", } +interface TraceData { + trace: FirebasePerformanceTypes.Trace; + // eslint-disable-next-line no-undef + timeoutId: NodeJS.Timeout; +} + export interface FirebaseTraceSlice { - activeTraces: Record; + activeTraces: Record; startTrace: ( traceId: string ) => Promise; stopTrace: ( traceId: string ) => Promise; + clearTrace: ( traceId: string ) => void; } const createFirebaseTraceSlice: StateCreator @@ -17,19 +24,35 @@ const createFirebaseTraceSlice: StateCreator startTrace: async ( traceId: string ) => { const trace = await perf().startTrace( traceId ); + + const timeoutId = setTimeout( () => { + get().clearTrace( traceId ); + }, 10000 ); + set( state => ( { activeTraces: { ...state.activeTraces, - [traceId]: trace + [traceId]: { trace, timeoutId } } } ) ); }, stopTrace: async ( traceId: string ) => { const { activeTraces } = get(); - const selectedTrace = activeTraces[traceId]; - if ( selectedTrace ) { - await selectedTrace.stop(); + const traceData = activeTraces[traceId]; + if ( traceData ) { + get().clearTrace( traceId ); + + await traceData.trace.stop(); + } + }, + + clearTrace: ( traceId: string ) => { + const { activeTraces } = get(); + const traceData = activeTraces[traceId]; + if ( traceData ) { + clearTimeout( traceData.timeoutId ); + set( state => { const { [traceId]: _, ...remainingTraces } = state.activeTraces; return { activeTraces: remainingTraces };