From fc90a62716707cc2abba97162f78b914beb3cd4d Mon Sep 17 00:00:00 2001 From: Changkun Ou Date: Fri, 10 Apr 2026 22:35:14 +0200 Subject: [PATCH] fix: replace panic("unreachable") with descriptive error in SSE handler The SSE event loop in handleSSEResponse could exit without hitting a terminal event (parse_done or parse_failed) when the server disconnects prematurely. This was guarded by panic("unreachable") which crashed the caller. Return a descriptive error instead, reporting whether zero or partial events were received and the last event name seen. --- parse_get.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/parse_get.go b/parse_get.go index 8910a3e..6a9cdb2 100644 --- a/parse_get.go +++ b/parse_get.go @@ -148,11 +148,16 @@ func (c *Client) handleSSEResponse(req *http.Request, onUpdate ParseResultUpdate return &result, nil } + var lastEvent string + var eventCount int for ev, err := range sse.ScanEvents(resp.Body) { if err != nil { return nil, fmt.Errorf("failed to scan SSE events: %w", err) } + lastEvent = ev.Name() + eventCount++ + // Unmarshal the event data into a ParseResult. var result ParseResult if err := json.Unmarshal(ev.Data(), &result); err != nil { @@ -182,5 +187,8 @@ func (c *Client) handleSSEResponse(req *http.Request, onUpdate ParseResultUpdate } } - panic("unreachable") + if eventCount == 0 { + return nil, fmt.Errorf("SSE stream closed without sending any events") + } + return nil, fmt.Errorf("SSE stream ended after %d event(s), last event %q, without a terminal event (parse_done or parse_failed)", eventCount, lastEvent) }