Skip to content

Commit 835669a

Browse files
committed
Fix MetricsManager
1 parent 2659b50 commit 835669a

5 files changed

Lines changed: 51 additions & 37 deletions

File tree

browser-extension/src/content/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { initializeGlobalGate, protectedExecute } from '@/shared/InitializationG
77
import { createNavigationWatcher } from './utils/NavigationWatcher';
88
import { isInAllowedGroupNow } from '@/content/utils/group';
99
import { log, error } from '@/shared/logger';
10+
import { metricsManager } from './metrics/MetricsManager';
1011

1112
declare const __DEV__: boolean;
1213
if (!__DEV__) {
@@ -30,6 +31,10 @@ async function initializeExtensionFeatures(): Promise<void> {
3031
await protectedExecute(async () => {
3132
log('Initializing extension features');
3233

34+
// Initialize MetricsManager first (uses existing validated session)
35+
await metricsManager.initialize();
36+
log('MetricsManager initialized');
37+
3338
// Create post observer (but don't start processing yet)
3439
postObserver = new FacebookPostObserver();
3540

@@ -89,6 +94,11 @@ function cleanupExtension(): void {
8994
chatWindow = null;
9095
}
9196

97+
// Clean up MetricsManager
98+
metricsManager.destroy().catch(err => {
99+
error('Failed to destroy MetricsManager:', err);
100+
});
101+
92102
analytics.setEnabled(false);
93103
log('Extension resources cleaned up');
94104
}

browser-extension/src/content/metrics/AnalyticsEventCollector.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { analytics } from '@/shared/analytics';
2-
import type { EventBatchRequest, UnifiedAnalyticsEvent, MetricsConfig, ScrollMetrics } from '@/shared/types';
2+
import type { EventBatchRequest, UnifiedAnalyticsEvent, MetricsConfig, ScrollMetrics, EventCategory } from '@/shared/types';
33
import { sendAnalyticsEvents } from '../messaging';
44
import { ComprehensiveAnalyticsManager } from './ComprehensiveAnalyticsManager';
55

@@ -39,7 +39,7 @@ export class AnalyticsEventCollector {
3939

4040
public trackEvent(
4141
eventType: string,
42-
category: 'session' | 'post' | 'chat' | 'interaction' | 'performance',
42+
category: EventCategory,
4343
data: Record<string, unknown>,
4444
postId?: string
4545
): void {

browser-extension/src/content/metrics/MetricsManager.ts

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import { log, error } from '../../shared/logger';
66
import { AnalyticsEventCollector } from './AnalyticsEventCollector';
77
import { ComprehensiveAnalyticsManager } from './ComprehensiveAnalyticsManager';
8-
import { MetricsConfig, UserSession } from '../../shared/types';
9-
import { verifyAndInitializeUserSession } from '../utils/initialization';
8+
import { MetricsConfig, UserSession, EventCategory } from '../../shared/types';
109
import { analytics } from '@/shared/analytics';
1110
import { getSessionHiddenTimeoutMs } from '@/shared/env';
1211
import { isInAllowedGroupNow } from '@/content/utils/group';
12+
import { requireGlobalInitialization, protectedExecute } from '@/shared/InitializationGate';
1313

1414
export 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 {

browser-extension/src/shared/SessionManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { STORAGE_KEYS } from './constants';
77
import { log, error } from './logger';
8-
import { UserSessionInfo } from '../content/utils/initialization';
8+
import type { UserSessionInfo } from '../content/utils/initialization';
99

1010
export interface SessionManagerConfig {
1111
requireValidSession: boolean;

browser-extension/src/shared/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ export type EventCategory =
6161
| 'trust'
6262
| 'ui'
6363
| 'content'
64-
| 'learning';
64+
| 'learning'
65+
| 'error';
6566

6667
export type EventPriority = 'critical' | 'high' | 'medium' | 'low';
6768

0 commit comments

Comments
 (0)