github-actions
Deploy to Hugging Face
c794b6b
|
Raw
History Blame Contribute Delete
1.9 kB
# Frontend Architecture Audit
## Issues Identified
### 1. Excessive Polling & "Thundering Herd" Problems
The frontend makes aggressive use of `setInterval` across multiple components to fetch data (e.g., `EmergencyPage`, `GossipGraph`). In some areas, these intervals interact poorly with retry logic.
- **`useCommandApiStatus.js`**: Contained a critical bug where `setInterval` continued running even after the backend was marked offline, while `setTimeout` retry logic concurrently fired. This created exponential background polling, degrading browser performance and network availability.
### 2. State Leaks on Unmounted Components
- **`AlertFeed.jsx`**: Inside a `setInterval` loop, a `setTimeout` was used to delay a state update. The interval was cleared on unmount, but the timeout was not, leading to React state updates on an unmounted component.
### 3. Missing Event Listener Cleanup
- **`continuousPlatformService.js`**: Functions like `bindWsPollListeners` attach global `window` and `document` event listeners (e.g., `visibilitychange`, `cepheus:vision-ws-open`). Although structured as singletons, lack of explicit `removeEventListener` can cause issues during HMR or if the app's initialization cycle runs multiple times.
### 4. Direct Mutation of Global State
- **`GossipGraph.jsx`**: Manual mutations of the `zustand` store variables (e.g., `faceRes[camId] = ...`) were spotted instead of using immutable updates. This can cause components relying on those specific slices of state to bypass re-renders or suffer from tearing.
## Recommendations
- Consolidate polling loops into the central WebSocket (`wsVisionSingleton.js`).
- Always return a cleanup function in `useEffect` that clears *all* asynchronous boundaries (`setTimeout` and `setInterval`).
- Switch to structured state updaters via `zustand` actions rather than shallow copying and mutating nested store objects.