|
1 | 1 | import { ReadableStream, type Response } from './_shims/index';
|
2 | 2 | import { OpenAIError } from './error';
|
3 | 3 | import { LineDecoder } from './internal/decoders/line';
|
| 4 | +import { ReadableStreamToAsyncIterable } from './internal/stream-utils'; |
4 | 5 |
|
5 | 6 | import { APIError } from './error';
|
6 | 7 |
|
@@ -80,7 +81,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
80 | 81 | async function* iterLines(): AsyncGenerator<string, void, unknown> {
|
81 | 82 | const lineDecoder = new LineDecoder();
|
82 | 83 |
|
83 |
| - const iter = readableStreamAsyncIterable<Bytes>(readableStream); |
| 84 | + const iter = ReadableStreamToAsyncIterable<Bytes>(readableStream); |
84 | 85 | for await (const chunk of iter) {
|
85 | 86 | for (const line of lineDecoder.decode(chunk)) {
|
86 | 87 | yield line;
|
@@ -194,7 +195,7 @@ export async function* _iterSSEMessages(
|
194 | 195 | const sseDecoder = new SSEDecoder();
|
195 | 196 | const lineDecoder = new LineDecoder();
|
196 | 197 |
|
197 |
| - const iter = readableStreamAsyncIterable<Bytes>(response.body); |
| 198 | + const iter = ReadableStreamToAsyncIterable<Bytes>(response.body); |
198 | 199 | for await (const sseChunk of iterSSEChunks(iter)) {
|
199 | 200 | for (const line of lineDecoder.decode(sseChunk)) {
|
200 | 201 | const sse = sseDecoder.decode(line);
|
@@ -347,36 +348,3 @@ function partition(str: string, delimiter: string): [string, string, string] {
|
347 | 348 |
|
348 | 349 | return [str, '', ''];
|
349 | 350 | }
|
350 |
| - |
351 |
| -/** |
352 |
| - * Most browsers don't yet have async iterable support for ReadableStream, |
353 |
| - * and Node has a very different way of reading bytes from its "ReadableStream". |
354 |
| - * |
355 |
| - * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490 |
356 |
| - */ |
357 |
| -export function readableStreamAsyncIterable<T>(stream: any): AsyncIterableIterator<T> { |
358 |
| - if (stream[Symbol.asyncIterator]) return stream; |
359 |
| - |
360 |
| - const reader = stream.getReader(); |
361 |
| - return { |
362 |
| - async next() { |
363 |
| - try { |
364 |
| - const result = await reader.read(); |
365 |
| - if (result?.done) reader.releaseLock(); // release lock when stream becomes closed |
366 |
| - return result; |
367 |
| - } catch (e) { |
368 |
| - reader.releaseLock(); // release lock when stream becomes errored |
369 |
| - throw e; |
370 |
| - } |
371 |
| - }, |
372 |
| - async return() { |
373 |
| - const cancelPromise = reader.cancel(); |
374 |
| - reader.releaseLock(); |
375 |
| - await cancelPromise; |
376 |
| - return { done: true, value: undefined }; |
377 |
| - }, |
378 |
| - [Symbol.asyncIterator]() { |
379 |
| - return this; |
380 |
| - }, |
381 |
| - }; |
382 |
| -} |
0 commit comments