fix(sse): stop scanner sender when stream context cancels

This commit is contained in:
CJACK.
2026-04-29 22:59:22 +08:00
parent 89225c778e
commit 6d3979a1d6

View File

@@ -29,15 +29,29 @@ func StartParsedLinePump(ctx context.Context, body io.Reader, thinkingEnabled bo
eof bool eof bool
} }
lineCh := make(chan scanItem, 1) lineCh := make(chan scanItem, 1)
stopScanner := make(chan struct{})
defer close(stopScanner)
go func() { go func() {
sendScanItem := func(item scanItem) bool {
select {
case lineCh <- item:
return true
case <-ctx.Done():
return false
case <-stopScanner:
return false
}
}
defer close(lineCh)
scanner := bufio.NewScanner(body) scanner := bufio.NewScanner(body)
scanner.Buffer(make([]byte, 0, scannerBufferSize), maxScannerLineSize) scanner.Buffer(make([]byte, 0, scannerBufferSize), maxScannerLineSize)
for scanner.Scan() { for scanner.Scan() {
line := append([]byte{}, scanner.Bytes()...) line := append([]byte{}, scanner.Bytes()...)
lineCh <- scanItem{line: line} if !sendScanItem(scanItem{line: line}) {
return
}
} }
lineCh <- scanItem{err: scanner.Err(), eof: true} _ = sendScanItem(scanItem{err: scanner.Err(), eof: true})
close(lineCh)
}() }()
ticker := time.NewTicker(maxFlushWait) ticker := time.NewTicker(maxFlushWait)