fix(dashboard): close SSE connections on outbound backpressure

The global SSE broadcast called res.write() without checking the return
value, so a paused or backgrounded client would silently accumulate
every store event for every entity (tasks, missions, plugins, agents,
chat, ...) into res.outputData until the dashboard process OOMed.
Add a 4 MB writableLength threshold; when exceeded, tear down the
connection so the OS releases the buffer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Fusion
2026-04-24 22:02:40 -07:00
committed by gsxdsm
parent 4b95ada290
commit bafad3d45a
6 changed files with 142 additions and 8 deletions

View File

@@ -32,6 +32,7 @@ function normalizeTaskView(value: TaskView): TaskView {
interface UseViewStateOptions {
projectsLoading: boolean;
projectsError: string | null;
currentProjectLoading: boolean;
currentProject: ProjectInfo | null;
projectsLength: number;
@@ -53,6 +54,7 @@ export interface UseViewStateResult {
export function useViewState(options: UseViewStateOptions): UseViewStateResult {
const {
projectsLoading,
projectsError,
currentProjectLoading,
currentProject,
projectsLength,
@@ -112,6 +114,7 @@ export function useViewState(options: UseViewStateOptions): UseViewStateResult {
useEffect(() => {
if (projectsLoading || currentProjectLoading) return;
if (setupWizardOpen) return;
if (projectsError) return;
if (projectsLength > 0 || currentProject) return;
const timer = window.setTimeout(() => {
@@ -121,6 +124,7 @@ export function useViewState(options: UseViewStateOptions): UseViewStateResult {
return () => window.clearTimeout(timer);
}, [
projectsLoading,
projectsError,
projectsLength,
currentProjectLoading,
currentProject,