55import { log , error } from '../../shared/logger' ;
66import { AnalyticsEventCollector } from './AnalyticsEventCollector' ;
77import { ComprehensiveAnalyticsManager } from './ComprehensiveAnalyticsManager' ;
8- import { MetricsConfig , UserSession } from '../../shared/types' ;
9- import { verifyAndInitializeUserSession } from '../utils/initialization' ;
8+ import { MetricsConfig , UserSession , EventCategory } from '../../shared/types' ;
109import { analytics } from '@/shared/analytics' ;
1110import { getSessionHiddenTimeoutMs } from '@/shared/env' ;
1211import { isInAllowedGroupNow } from '@/content/utils/group' ;
12+ import { requireGlobalInitialization , protectedExecute } from '@/shared/InitializationGate' ;
1313
1414export class MetricsManager {
1515 private rawCollector : AnalyticsEventCollector | null = null ;
@@ -29,20 +29,17 @@ export class MetricsManager {
2929 if ( this . isInitialized ) return ;
3030
3131 try {
32- // CRITICAL: Verify and initialize user/session BEFORE any analytics or post processing
33- const { userId : backendUserId , sessionId : backendSessionId , isNewUser, isNewSession } =
34- await verifyAndInitializeUserSession ( ) ;
32+ // Get session data from centralized SessionManager via InitializationGate
33+ const sessionData = requireGlobalInitialization ( ) ;
3534
36- log ( 'User/Session verified and initialized' , {
37- userId : backendUserId ,
38- sessionId : backendSessionId ,
39- isNewUser,
40- isNewSession
35+ log ( 'Using existing validated session for MetricsManager' , {
36+ userId : sessionData . userId ,
37+ sessionId : sessionData . sessionId
4138 } ) ;
4239
4340 this . session = {
44- userId : backendUserId ,
45- sessionId : backendSessionId ,
41+ userId : sessionData . userId ,
42+ sessionId : sessionData . sessionId ,
4643 startTime : Date . now ( ) ,
4744 lastActivity : Date . now ( ) ,
4845 } ;
@@ -56,15 +53,15 @@ export class MetricsManager {
5653
5754 // Initialize analytics event collector (legacy support)
5855 this . rawCollector = new AnalyticsEventCollector ( config ) ;
59- this . rawCollector . setSession ( backendUserId , backendSessionId ) ;
56+ this . rawCollector . setSession ( sessionData . userId , sessionData . sessionId ) ;
6057
6158 // Initialize comprehensive analytics system
62- this . comprehensiveAnalytics = new ComprehensiveAnalyticsManager ( backendUserId , backendSessionId ) ;
59+ this . comprehensiveAnalytics = new ComprehensiveAnalyticsManager ( sessionData . userId , sessionData . sessionId ) ;
6360
6461 // Hook Mixpanel identity and super props
65- analytics . identify ( backendUserId ) ;
62+ analytics . identify ( sessionData . userId ) ;
6663 analytics . registerSuper ( {
67- session_id : backendSessionId ,
64+ session_id : sessionData . sessionId ,
6865 platform : 'chrome_extension' ,
6966 environment : process . env . NODE_ENV || 'production' ,
7067 } ) ;
@@ -104,7 +101,7 @@ export class MetricsManager {
104101 this . setupPageLifecycle ( ) ;
105102
106103 this . isInitialized = true ;
107- log ( 'MetricsManager initialized' , { userId : backendUserId , sessionId : backendSessionId } ) ;
104+ log ( 'MetricsManager initialized' , { userId : sessionData . userId , sessionId : sessionData . sessionId } ) ;
108105 } catch ( err ) {
109106 error ( 'Failed to initialize MetricsManager:' , err ) ;
110107 }
@@ -117,23 +114,29 @@ export class MetricsManager {
117114 label ?: string ;
118115 metadata ?: Record < string , unknown > ;
119116 } ) : void {
120- if ( ! this . session || ! this . rawCollector ) {
121- log ( 'MetricsManager not initialized, skipping event:' , event . type ) ;
122- return ;
123- }
117+ // Use protectedExecute to ensure tracking only happens with valid session
118+ protectedExecute ( async ( ) => {
119+ if ( ! this . session || ! this . rawCollector ) {
120+ log ( 'MetricsManager not initialized, skipping event:' , event . type ) ;
121+ return ;
122+ }
124123
125- this . updateLastActivity ( ) ;
126- // Route to unified analytics event collector
127- const data : Record < string , unknown > = {
128- ...( event . metadata || { } ) ,
129- } ;
130- if ( typeof event . value !== 'undefined' ) data . value = event . value ;
131- if ( typeof event . label !== 'undefined' ) data . label = event . label ;
132- this . rawCollector . trackEvent (
133- event . type ,
134- event . category as 'session' | 'post' | 'chat' | 'interaction' | 'performance' ,
135- data ,
136- ) ;
124+ this . updateLastActivity ( ) ;
125+ // Route to unified analytics event collector
126+ const data : Record < string , unknown > = {
127+ ...( event . metadata || { } ) ,
128+ } ;
129+ if ( typeof event . value !== 'undefined' ) data . value = event . value ;
130+ if ( typeof event . label !== 'undefined' ) data . label = event . label ;
131+ this . rawCollector . trackEvent (
132+ event . type ,
133+ event . category as EventCategory ,
134+ data ,
135+ ) ;
136+ } , `trackEvent:${ event . type } ` ) . catch ( err => {
137+ // Non-blocking: metrics tracking failure shouldn't break the app
138+ log ( 'Failed to track event:' , event . type , err ) ;
139+ } ) ;
137140 }
138141
139142 public trackPostView ( postId : string , postElement : Element ) : void {
0 commit comments