Skip to content

Commit 4a4f9a1

Browse files
stainless-botRobertCraigie
authored andcommitted
chore(internal): minor restructuring
chore: unknown commit message
1 parent 2063781 commit 4a4f9a1

File tree

2 files changed

+36
-35
lines changed

2 files changed

+36
-35
lines changed

src/internal/shims.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,36 @@ export function ReadableStreamFrom<T>(iterable: Iterable<T> | AsyncIterable<T>):
110110
},
111111
});
112112
}
113+
114+
/**
115+
* Most browsers don't yet have async iterable support for ReadableStream,
116+
* and Node has a very different way of reading bytes from its "ReadableStream".
117+
*
118+
* This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490
119+
*/
120+
export function ReadableStreamToAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {
121+
if (stream[Symbol.asyncIterator]) return stream;
122+
123+
const reader = stream.getReader();
124+
return {
125+
async next() {
126+
try {
127+
const result = await reader.read();
128+
if (result?.done) reader.releaseLock(); // release lock when stream becomes closed
129+
return result;
130+
} catch (e) {
131+
reader.releaseLock(); // release lock when stream becomes errored
132+
throw e;
133+
}
134+
},
135+
async return() {
136+
const cancelPromise = reader.cancel();
137+
reader.releaseLock();
138+
await cancelPromise;
139+
return { done: true, value: undefined };
140+
},
141+
[Symbol.asyncIterator]() {
142+
return this;
143+
},
144+
};
145+
}

src/streaming.ts

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AnthropicError } from './error';
22
import { type ReadableStream } from './internal/shim-types';
33
import { makeReadableStream } from './internal/shims';
44
import { LineDecoder } from './internal/decoders/line';
5+
import { ReadableStreamToAsyncIterable } from './internal/shims';
56

67
import { APIError } from './error';
78

@@ -93,7 +94,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
9394
async function* iterLines(): AsyncGenerator<string, void, unknown> {
9495
const lineDecoder = new LineDecoder();
9596

96-
const iter = readableStreamAsyncIterable<Bytes>(readableStream);
97+
const iter = ReadableStreamToAsyncIterable<Bytes>(readableStream);
9798
for await (const chunk of iter) {
9899
for (const line of lineDecoder.decode(chunk)) {
99100
yield line;
@@ -207,7 +208,7 @@ export async function* _iterSSEMessages(
207208
const sseDecoder = new SSEDecoder();
208209
const lineDecoder = new LineDecoder();
209210

210-
const iter = readableStreamAsyncIterable<Bytes>(response.body);
211+
const iter = ReadableStreamToAsyncIterable<Bytes>(response.body);
211212
for await (const sseChunk of iterSSEChunks(iter)) {
212213
for (const line of lineDecoder.decode(sseChunk)) {
213214
const sse = sseDecoder.decode(line);
@@ -360,36 +361,3 @@ function partition(str: string, delimiter: string): [string, string, string] {
360361

361362
return [str, '', ''];
362363
}
363-
364-
/**
365-
* Most browsers don't yet have async iterable support for ReadableStream,
366-
* and Node has a very different way of reading bytes from its "ReadableStream".
367-
*
368-
* This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490
369-
*/
370-
export function readableStreamAsyncIterable<T>(stream: any): AsyncIterableIterator<T> {
371-
if (stream[Symbol.asyncIterator]) return stream;
372-
373-
const reader = stream.getReader();
374-
return {
375-
async next() {
376-
try {
377-
const result = await reader.read();
378-
if (result?.done) reader.releaseLock(); // release lock when stream becomes closed
379-
return result;
380-
} catch (e) {
381-
reader.releaseLock(); // release lock when stream becomes errored
382-
throw e;
383-
}
384-
},
385-
async return() {
386-
const cancelPromise = reader.cancel();
387-
reader.releaseLock();
388-
await cancelPromise;
389-
return { done: true, value: undefined };
390-
},
391-
[Symbol.asyncIterator]() {
392-
return this;
393-
},
394-
};
395-
}

0 commit comments

Comments
 (0)