From ac503b3ae56a64c13553a3dbc648e3bac7f877c8 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Wed, 12 Aug 2026 19:25:47 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A5(frontend)=20drop=20unused=20vendor?= =?UTF-8?q?ed=20ConnectionObserver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The vendored ConnectionObserver collected connection data that never turned out to be useful for debugging. Remove it to reduce dead code, and re-add a targeted observer later if a concrete debugging need shows up. --- CHANGELOG.md | 4 + .../features/rooms/components/Conference.tsx | 16 --- .../src/features/rooms/components/Rating.tsx | 5 - .../livekit/components/ConnectionObserver.tsx | 108 +----------------- .../src/features/rooms/routes/Feedback.tsx | 5 - src/frontend/src/stores/connectionObserver.ts | 14 --- 6 files changed, 5 insertions(+), 147 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5471cedd..eaac76e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to ## [Unreleased] +### Changed + +- 🔥(frontend) drop unused vendored ConnectionObserver + ### Fixed - 📈(frontend) downgrade unreachable external home URL from error to event diff --git a/src/frontend/src/features/rooms/components/Conference.tsx b/src/frontend/src/features/rooms/components/Conference.tsx index 5c7fd162..d50df015 100644 --- a/src/frontend/src/features/rooms/components/Conference.tsx +++ b/src/frontend/src/features/rooms/components/Conference.tsx @@ -30,7 +30,6 @@ import { useConfig } from '@/api/useConfig' import { isFireFox } from '@/utils/livekit' import { useIsMobile } from '@/utils/useIsMobile' import { navigateTo } from '@/navigation/navigateTo' -import { connectionObserverStore } from '@/stores/connectionObserver' import { PictureInPictureConference } from '@/features/pip/components/PictureInPictureConference' import { notifyAutoMutedOnJoin } from '@/features/notifications/utils' import { useSnapshot } from 'valtio' @@ -247,23 +246,8 @@ export const Conference = ({ onDisconnected={(e) => { const metadata = { room_id: roomId, - pc_publisher: connectionObserverStore.publisher && { - ...connectionObserverStore.publisher, - }, - pc_subscriber: connectionObserverStore.subscriber && { - ...connectionObserverStore.subscriber, - }, - pc_publisher_changes_count: - connectionObserverStore.publisherChangesCount, - pc_subscriber_changes_count: - connectionObserverStore.subscriberChangesCount, } - connectionObserverStore.publisher = null - connectionObserverStore.publisherChangesCount = 0 - connectionObserverStore.subscriber = null - connectionObserverStore.subscriberChangesCount = 0 - switch (e) { case DisconnectReason.CLIENT_INITIATED: navigateTo( diff --git a/src/frontend/src/features/rooms/components/Rating.tsx b/src/frontend/src/features/rooms/components/Rating.tsx index ec2f20fe..04b82426 100644 --- a/src/frontend/src/features/rooms/components/Rating.tsx +++ b/src/frontend/src/features/rooms/components/Rating.tsx @@ -5,7 +5,6 @@ import { useTranslation } from 'react-i18next' import { styled, VStack } from '@/styled-system/jsx' import { Button as RACButton } from 'react-aria-components' import { useIsAnalyticsEnabled } from '@/features/analytics/hooks/useIsAnalyticsEnabled' -import type { CandidateInfo } from '@/stores/connectionObserver' import { captureEvent } from '@/features/analytics/telemetry' const Card = styled('div', { @@ -240,10 +239,6 @@ const ConfirmationMessage = ({ onNext }: { onNext: () => void }) => { type RatingMetadata = { room_id?: string - pc_publisher?: CandidateInfo - pc_subscriber?: CandidateInfo - pc_publisher_changes_count?: number - pc_subscriber_changes_count?: number } export const Rating = ({ diff --git a/src/frontend/src/features/rooms/livekit/components/ConnectionObserver.tsx b/src/frontend/src/features/rooms/livekit/components/ConnectionObserver.tsx index baab2a9d..4cd846ce 100644 --- a/src/frontend/src/features/rooms/livekit/components/ConnectionObserver.tsx +++ b/src/frontend/src/features/rooms/livekit/components/ConnectionObserver.tsx @@ -9,14 +9,9 @@ import { useSnapshot } from 'valtio' import { DisconnectReason, RoomEvent } from 'livekit-client' import { userPreferencesStore } from '@/stores/userPreferences' -import { connectionObserverStore } from '@/stores/connectionObserver' -import { useFeatureFlagEnabled } from 'posthog-js/react' -import { isMobileBrowser } from '@livekit/components-core' -import { FeatureFlags } from '@/features/analytics/enums' import { captureEvent, captureMediaEvent } from '@/features/analytics/telemetry' - -const CANDIDATE_POLL_INTERVAL_MS = 5000 +import { connectionObserverStore } from '@/stores/connectionObserver' export const ConnectionObserver = () => { const room = useRoomContext() @@ -24,13 +19,6 @@ export const ConnectionObserver = () => { const { data } = useConfig() const isAnalyticsEnabled = useIsAnalyticsEnabled() - - const featureEnabled = useFeatureFlagEnabled(FeatureFlags.candidatePolling) - const isMobile = isMobileBrowser() - - const isAdvancedConnectionObserverEnabled = - !isMobile && isAnalyticsEnabled && featureEnabled - const userPreferencesSnap = useSnapshot(userPreferencesStore) const idleDisconnectModalTimeoutRef = useRef { userPreferencesSnap.is_idle_disconnect_modal_enabled, ]) - useEffect(() => { - if (!isAdvancedConnectionObserverEnabled) return - if (!room) return - - let interval: ReturnType | null = null - - const pollCandidate = async ( - label: 'publisher' | 'subscriber', - // eslint-disable-next-line @typescript-eslint/no-explicit-any - pc?: any - ) => { - if (!pc) return - - let stats: RTCStatsReport - try { - stats = await pc.getStats() - } catch { - return - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - stats.forEach((report: any) => { - if ( - report.type === 'candidate-pair' && - report.state === 'succeeded' && - report.nominated - ) { - const remoteCandidate = stats.get(report.remoteCandidateId) - if (!remoteCandidate) return - - const next = { - type: remoteCandidate.candidateType, - address: remoteCandidate.address, - protocol: remoteCandidate.protocol, - } - - const current = connectionObserverStore[label] - - const hasChanged = - current?.type !== next.type || - current?.address !== next.address || - current?.protocol !== next.protocol - - if (hasChanged) { - connectionObserverStore[label] = next - const key = `${label}ChangesCount` as const - connectionObserverStore[key] = - (connectionObserverStore[key] || 0) + 1 - } - } - }) - } - - const poll = async () => { - const publisher = room.engine?.pcManager?.publisher - const subscriber = room.engine?.pcManager?.subscriber - - await Promise.all([ - pollCandidate('publisher', publisher), - pollCandidate('subscriber', subscriber), - ]) - } - - const startPolling = async () => { - if (interval) return // prevent duplicates - - // Initial snapshot - await poll() - - interval = setInterval(poll, CANDIDATE_POLL_INTERVAL_MS) - } - - const stopPolling = () => { - if (!interval) return - clearInterval(interval) - interval = null - } - - room.on(RoomEvent.Connected, startPolling) - room.on(RoomEvent.Reconnected, startPolling) - - room.on(RoomEvent.Reconnecting, stopPolling) - room.on(RoomEvent.Disconnected, stopPolling) - - return () => { - stopPolling() - - room.off(RoomEvent.Connected, startPolling) - room.off(RoomEvent.Reconnected, startPolling) - room.off(RoomEvent.Reconnecting, stopPolling) - room.off(RoomEvent.Disconnected, stopPolling) - } - }, [room, isAdvancedConnectionObserverEnabled]) - useEffect(() => { if (!isAnalyticsEnabled) return diff --git a/src/frontend/src/features/rooms/routes/Feedback.tsx b/src/frontend/src/features/rooms/routes/Feedback.tsx index 7729bf6e..1d526805 100644 --- a/src/frontend/src/features/rooms/routes/Feedback.tsx +++ b/src/frontend/src/features/rooms/routes/Feedback.tsx @@ -6,7 +6,6 @@ import { Rating } from '@/features/rooms/components/Rating.tsx' import { useLocation } from 'wouter' import { useMemo } from 'react' import { DisconnectReason } from 'livekit-client' -import type { CandidateInfo } from '@/stores/connectionObserver' // fixme - duplicated with home, refactor in a proper style const Heading = styled('h1', { @@ -48,10 +47,6 @@ const FeedbackRoute = () => { const state = window.history.state return { room_id: state?.room_id as string, - pc_publisher: state?.pc_publisher as CandidateInfo, - pc_publisher_changes_count: state?.pc_publisher_changes_count as number, - pc_subscriber: state?.pc_subscriber as CandidateInfo, - pc_subscriber_changes_count: state?.pc_subscriber_changes_count as number, } }, []) diff --git a/src/frontend/src/stores/connectionObserver.ts b/src/frontend/src/stores/connectionObserver.ts index 1ee48758..5149cd59 100644 --- a/src/frontend/src/stores/connectionObserver.ts +++ b/src/frontend/src/stores/connectionObserver.ts @@ -1,23 +1,9 @@ import { proxy } from 'valtio' -export type CandidateInfo = { - type: string - address: string - protocol: string -} - type State = { isIdleDisconnectModalOpen: boolean - publisher: CandidateInfo | null - publisherChangesCount: number - subscriber: CandidateInfo | null - subscriberChangesCount: number } export const connectionObserverStore = proxy({ isIdleDisconnectModalOpen: false, - publisher: null, - publisherChangesCount: 0, - subscriber: null, - subscriberChangesCount: 0, })