33 lines
741 B
TypeScript
33 lines
741 B
TypeScript
export async function consumeReadableStream(
|
|
stream: ReadableStream<Uint8Array>,
|
|
callback: (chunk: string) => void,
|
|
signal: AbortSignal
|
|
): Promise<void> {
|
|
const reader = stream.getReader()
|
|
const decoder = new TextDecoder()
|
|
|
|
signal.addEventListener("abort", () => reader.cancel(), { once: true })
|
|
|
|
try {
|
|
while (true) {
|
|
const { done, value } = await reader.read()
|
|
|
|
if (done) {
|
|
break
|
|
}
|
|
|
|
if (value) {
|
|
callback(decoder.decode(value, { stream: true }))
|
|
}
|
|
}
|
|
} catch (error) {
|
|
if (signal.aborted) {
|
|
console.error("Stream reading was aborted:", error)
|
|
} else {
|
|
console.error("Error consuming stream:", error)
|
|
}
|
|
} finally {
|
|
reader.releaseLock()
|
|
}
|
|
}
|