diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.test.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.test.ts index a5f507b77b..58013c888a 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.test.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.test.ts @@ -75,6 +75,7 @@ const waitForMixpanelInit = () => vi.waitFor(() => expect(mockMixpanel.init).toHaveBeenCalled()) type ConfigWindow = { __CONFIG__?: { mixpanel_token?: string } } +type DefineGlobal = typeof globalThis & { __DEV_SERVER_COMFYUI_URL__: string } describe('MixpanelTelemetryProvider — without configured token', () => { beforeEach(() => { @@ -103,6 +104,7 @@ describe('MixpanelTelemetryProvider — without configured token', () => { describe('MixpanelTelemetryProvider — with configured token', () => { beforeEach(() => { vi.clearAllMocks() + ;(globalThis as DefineGlobal).__DEV_SERVER_COMFYUI_URL__ = '' ;(window as unknown as ConfigWindow).__CONFIG__ = { mixpanel_token: 'test-token' } @@ -112,6 +114,26 @@ describe('MixpanelTelemetryProvider — with configured token', () => { mockNormalizeSurveyResponses.mockImplementation((responses) => responses) }) + it('does not initialize Mixpanel for loopback cloud dev', () => { + ;(globalThis as DefineGlobal).__DEV_SERVER_COMFYUI_URL__ = + 'http://localhost:8188' + const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined) + + try { + const provider = new MixpanelTelemetryProvider() + provider.trackUserLoggedIn() + + expect(warn).toHaveBeenCalledWith( + expect.stringContaining('disabled in local cloud dev') + ) + expect(mockMixpanel.init).not.toHaveBeenCalled() + expect(mockMixpanel.track).not.toHaveBeenCalled() + } finally { + warn.mockRestore() + ;(globalThis as DefineGlobal).__DEV_SERVER_COMFYUI_URL__ = '' + } + }) + it('initializes Mixpanel and tracks events synchronously after the loaded callback fires', async () => { const provider = new MixpanelTelemetryProvider() await waitForMixpanelInit() diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index 3a7fe9b20c..d7adc7b633 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -69,6 +69,8 @@ const DEFAULT_DISABLED_EVENTS = [ const TELEMETRY_EVENT_SET = new Set( Object.values(TelemetryEvents) as TelemetryEventName[] ) +const localOriginPattern = + /^https?:\/\/(localhost|127\.0\.0\.1|\[::1\])(?::\d+)?(?:\/|$)/ interface QueuedEvent { eventName: TelemetryEventName @@ -96,6 +98,12 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { private disabledEvents = new Set(DEFAULT_DISABLED_EVENTS) constructor() { + if (isLocalCloudDev()) { + console.warn('Mixpanel telemetry disabled in local cloud dev') + this.isEnabled = false + return + } + this.configureDisabledEvents( (window.__CONFIG__ as Partial | undefined) ?? null ) @@ -446,3 +454,9 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { this.trackEvent(TelemetryEvents.UI_BUTTON_CLICKED, metadata) } } + +function isLocalCloudDev(): boolean { + return ( + import.meta.env.DEV && localOriginPattern.test(__DEV_SERVER_COMFYUI_URL__) + ) +}