Skip to content

Commit e62ce42

Browse files
fix: trim event buffer to newest bytes instead of discarding on overflow
When the SSE event buffer exceeds maxEventBufferRemainder, keep the newest bytes rather than resetting entirely. This preserves the tail of in-flight partial events (where usage data in JSON is most likely found) instead of silently dropping them. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2f357ce commit e62ce42

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

internal/usage/stream_wrapper.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,13 @@ func (w *StreamUsageWrapper) processCompleteEvents() {
6464
// Find the last complete event boundary
6565
lastBoundary := bytes.LastIndex(data, []byte("\n\n"))
6666
if lastBoundary < 0 {
67-
// No complete event yet — apply safety valve on remainder size
67+
// No complete event yet — apply safety valve on remainder size.
68+
// Trim to keep only the newest bytes so partial events are preserved.
6869
if w.eventBuffer.Len() > maxEventBufferRemainder {
70+
tail := w.eventBuffer.Bytes()
71+
start := len(tail) - maxEventBufferRemainder
6972
w.eventBuffer.Reset()
73+
w.eventBuffer.Write(tail[start:])
7074
}
7175
return
7276
}
@@ -103,10 +107,11 @@ func (w *StreamUsageWrapper) processCompleteEvents() {
103107
// Keep only the remainder
104108
w.eventBuffer.Reset()
105109
if len(remainder) > 0 {
106-
// Safety valve on remainder size
107-
if len(remainder) <= maxEventBufferRemainder {
108-
w.eventBuffer.Write(remainder)
110+
// Safety valve on remainder size — trim to keep newest bytes
111+
if len(remainder) > maxEventBufferRemainder {
112+
remainder = remainder[len(remainder)-maxEventBufferRemainder:]
109113
}
114+
w.eventBuffer.Write(remainder)
110115
}
111116
}
112117

0 commit comments

Comments
 (0)