From 91e4bcf2c9fbcd6d5af1154aa86ee79badca60cc Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Wed, 8 Jul 2026 19:49:52 +0300 Subject: [PATCH] connections --- packages/tracker/meshnet_tracker/dashboard.html | 1 + packages/tracker/meshnet_tracker/server.py | 6 +++++- tests/test_dashboard.py | 1 + tests/test_tracker_routing.py | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/tracker/meshnet_tracker/dashboard.html b/packages/tracker/meshnet_tracker/dashboard.html index 6bcd175..2c15801 100644 --- a/packages/tracker/meshnet_tracker/dashboard.html +++ b/packages/tracker/meshnet_tracker/dashboard.html @@ -1316,6 +1316,7 @@ async function sendChat() { persistActiveChatSession(); renderChatStatus("done"); } catch (err) { + console.error("chat stream failed", err); assistantMessage.role = "error"; assistantMessage.content = err && err.message ? err.message : "request failed"; renderChatHistory(); diff --git a/packages/tracker/meshnet_tracker/server.py b/packages/tracker/meshnet_tracker/server.py index 291992b..1e53cb2 100644 --- a/packages/tracker/meshnet_tracker/server.py +++ b/packages/tracker/meshnet_tracker/server.py @@ -3312,6 +3312,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler): self.send_response(200) self.send_header("Content-Type", "text/event-stream; charset=utf-8") self.send_header("Cache-Control", "no-cache") + self.send_header("X-Accel-Buffering", "no") self.end_headers() stream_usage: dict | None = None observed_stream_tokens = 0 @@ -3354,7 +3355,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler): if usage is not None: stream_usage = usage except (BrokenPipeError, ConnectionResetError): - pass + client_gone = True if self._finalize_proxy_cancel( proxy_ctx=proxy_ctx, server=server, @@ -3392,6 +3393,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler): route_model=route_model, status=200, stream=True, + client_disconnected=client_gone, tokens=tokens, elapsed_seconds=round(elapsed, 4), tokens_per_sec=round(tokens / elapsed, 4) if elapsed > 0 else 0.0, @@ -3584,6 +3586,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler): self.send_response(int(first.get("status", 200))) self.send_header("Content-Type", headers.get("Content-Type", "text/event-stream; charset=utf-8")) self.send_header("Cache-Control", "no-cache") + self.send_header("X-Accel-Buffering", "no") self.end_headers() server: _TrackerHTTPServer = self.server # type: ignore[assignment] stream_usage: dict | None = None @@ -3657,6 +3660,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler): route_model=route_model, status=200, stream=True, + client_disconnected=client_gone, relay=True, tokens=tokens, elapsed_seconds=round(elapsed, 4), diff --git a/tests/test_dashboard.py b/tests/test_dashboard.py index ad05d48..af8fb5b 100644 --- a/tests/test_dashboard.py +++ b/tests/test_dashboard.py @@ -46,6 +46,7 @@ def test_dashboard_chat_uses_streaming_fetch(): assert "stream: true" in html assert ".body.getReader()" in html assert 'data === "[DONE]"' in html + assert 'console.error("chat stream failed", err)' in html def test_dashboard_served_by_follower(): diff --git a/tests/test_tracker_routing.py b/tests/test_tracker_routing.py index a6e60dc..6e34ff3 100644 --- a/tests/test_tracker_routing.py +++ b/tests/test_tracker_routing.py @@ -467,6 +467,7 @@ def test_tracker_logs_stream_progress_before_request_completes(): method="POST", ) response = urllib.request.urlopen(req, timeout=3.0) + assert response.headers["X-Accel-Buffering"] == "no" first_line = response.readline() assert first_line.startswith(b"data:") assert chunk_sent.wait(timeout=1.0)