diff --git a/packages/tracker/meshnet_tracker/server.py b/packages/tracker/meshnet_tracker/server.py index 5d42ba9..2e528c7 100644 --- a/packages/tracker/meshnet_tracker/server.py +++ b/packages/tracker/meshnet_tracker/server.py @@ -2702,22 +2702,38 @@ 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.end_headers() - stream_usage: dict | None = None - observed_stream_tokens = 0 - try: - while True: - line = upstream.readline() - if not line: - break - self.wfile.write(line) - self.wfile.flush() - observed, usage = _stream_line_tokens(line) - observed_stream_tokens += observed - if usage is not None: - stream_usage = usage - except BrokenPipeError: - pass + self.end_headers() + stream_usage: dict | None = None + observed_stream_tokens = 0 + client_gone = False + try: + while True: + line = upstream.readline() + if not line: + break + if not client_gone: + try: + self.wfile.write(line) + self.wfile.flush() + except (BrokenPipeError, ConnectionResetError): + # Keep draining upstream so completed node work is still billed. + client_gone = True + observed, usage = _stream_line_tokens(line) + observed_stream_tokens += observed + if observed: + _tracker_log_proxy_progress( + server, + request_id=request_id, + model=model, + route_model=route_model, + tokens=observed_stream_tokens, + started=started, + route_nodes=route_nodes, + ) + if usage is not None: + stream_usage = usage + except (BrokenPipeError, ConnectionResetError): + pass elapsed = time.monotonic() - started # Bill even on client disconnect — the nodes did the work. # Observed stream chunks are authoritative for the upper bound;