* Read lines from a stream (newline-delimited)
( reader: ReadableStreamDefaultReader<Uint8Array>, abortSignal?: AbortSignal, )
| 9 | * Read lines from a stream (newline-delimited) |
| 10 | */ |
| 11 | async function* readStreamLines( |
| 12 | reader: ReadableStreamDefaultReader<Uint8Array>, |
| 13 | abortSignal?: AbortSignal, |
| 14 | ): AsyncGenerator<string> { |
| 15 | try { |
| 16 | const decoder = createResponseStreamTextDecoder() |
| 17 | let buffer = '' |
| 18 | |
| 19 | while (!abortSignal?.aborted) { |
| 20 | const { done, value } = await reader.read() |
| 21 | if (done) break |
| 22 | |
| 23 | buffer += decoder.decode(value, { stream: true }) |
| 24 | const lines = buffer.split('\n') |
| 25 | |
| 26 | buffer = lines.pop() || '' |
| 27 | |
| 28 | for (const line of lines) { |
| 29 | if (line.trim()) { |
| 30 | yield line |
| 31 | } |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | if (buffer.trim()) { |
| 36 | yield buffer |
| 37 | } |
| 38 | } finally { |
| 39 | reader.releaseLock() |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | /** |
| 44 | * Parse a Response body as Server-Sent Events, yielding StreamChunks. |
no test coverage detected