@ai-sdk/provider-utils
Version:
34 lines (31 loc) • 929 B
text/typescript
import {
EventSourceParserStream,
type EventSourceMessage,
} from 'eventsource-parser/stream';
import { safeParseJSON, type ParseResult } from './parse-json';
import type { FlexibleSchema } from './schema';
/**
* Parses a JSON event stream into a stream of parsed JSON objects.
*/
export function parseJsonEventStream<T>({
stream,
schema,
}: {
stream: ReadableStream<Uint8Array>;
schema: FlexibleSchema<T>;
}): ReadableStream<ParseResult<T>> {
return stream
.pipeThrough(new TextDecoderStream())
.pipeThrough(new EventSourceParserStream())
.pipeThrough(
new TransformStream<EventSourceMessage, ParseResult<T>>({
async transform({ data }, controller) {
// ignore the 'DONE' event that e.g. OpenAI sends:
if (data === '[DONE]') {
return;
}
controller.enqueue(await safeParseJSON({ text: data, schema }));
},
}),
);
}