|
1 | 1 | import { ReadableStream, type Response } from './_shims/index'; |
2 | 2 | import { AnthropicError } from './error'; |
3 | 3 | import { LineDecoder } from './internal/decoders/line'; |
| 4 | +import { ReadableStreamToAsyncIterable } from './internal/stream-utils'; |
4 | 5 |
|
5 | 6 | import { createResponseHeaders } from './core'; |
6 | 7 | import { APIError } from './error'; |
@@ -98,7 +99,7 @@ export class Stream<Item> implements AsyncIterable<Item> { |
98 | 99 | async function* iterLines(): AsyncGenerator<string, void, unknown> { |
99 | 100 | const lineDecoder = new LineDecoder(); |
100 | 101 |
|
101 | | - const iter = readableStreamAsyncIterable<Bytes>(readableStream); |
| 102 | + const iter = ReadableStreamToAsyncIterable<Bytes>(readableStream); |
102 | 103 | for await (const chunk of iter) { |
103 | 104 | for (const line of lineDecoder.decode(chunk)) { |
104 | 105 | yield line; |
@@ -212,7 +213,7 @@ export async function* _iterSSEMessages( |
212 | 213 | const sseDecoder = new SSEDecoder(); |
213 | 214 | const lineDecoder = new LineDecoder(); |
214 | 215 |
|
215 | | - const iter = readableStreamAsyncIterable<Bytes>(response.body); |
| 216 | + const iter = ReadableStreamToAsyncIterable<Bytes>(response.body); |
216 | 217 | for await (const sseChunk of iterSSEChunks(iter)) { |
217 | 218 | for (const line of lineDecoder.decode(sseChunk)) { |
218 | 219 | const sse = sseDecoder.decode(line); |
@@ -365,36 +366,3 @@ function partition(str: string, delimiter: string): [string, string, string] { |
365 | 366 |
|
366 | 367 | return [str, '', '']; |
367 | 368 | } |
368 | | - |
369 | | -/** |
370 | | - * Most browsers don't yet have async iterable support for ReadableStream, |
371 | | - * and Node has a very different way of reading bytes from its "ReadableStream". |
372 | | - * |
373 | | - * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490 |
374 | | - */ |
375 | | -export function readableStreamAsyncIterable<T>(stream: any): AsyncIterableIterator<T> { |
376 | | - if (stream[Symbol.asyncIterator]) return stream; |
377 | | - |
378 | | - const reader = stream.getReader(); |
379 | | - return { |
380 | | - async next() { |
381 | | - try { |
382 | | - const result = await reader.read(); |
383 | | - if (result?.done) reader.releaseLock(); // release lock when stream becomes closed |
384 | | - return result; |
385 | | - } catch (e) { |
386 | | - reader.releaseLock(); // release lock when stream becomes errored |
387 | | - throw e; |
388 | | - } |
389 | | - }, |
390 | | - async return() { |
391 | | - const cancelPromise = reader.cancel(); |
392 | | - reader.releaseLock(); |
393 | | - await cancelPromise; |
394 | | - return { done: true, value: undefined }; |
395 | | - }, |
396 | | - [Symbol.asyncIterator]() { |
397 | | - return this; |
398 | | - }, |
399 | | - }; |
400 | | -} |
0 commit comments