|
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