Skip to content

Commit

Permalink
chore (dependencies): update eventsource-parser to 3.0.0 (#3511)
Browse files Browse the repository at this point in the history
  • Loading branch information
lgrammel authored Nov 6, 2024
1 parent fff8276 commit dce4158
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 44 deletions.
6 changes: 6 additions & 0 deletions .changeset/gorgeous-pumas-sparkle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@ai-sdk/provider-utils': patch
'ai': patch
---

chore (dependencies): update eventsource-parser to 3.0.0
5 changes: 5 additions & 0 deletions .changeset/spotty-wombats-pay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ai-sdk/provider-utils': patch
---

chore (dependencies): update nanoid to 5.0.8
2 changes: 1 addition & 1 deletion packages/ai/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
"@ai-sdk/react": "1.0.0-canary.3",
"@ai-sdk/ui-utils": "1.0.0-canary.3",
"@opentelemetry/api": "1.9.0",
"eventsource-parser": "1.1.2",
"eventsource-parser": "^3.0.0",
"jsondiffpatch": "0.6.0",
"json-schema": "^0.4.0",
"secure-json-parse": "^2.7.0",
Expand Down
46 changes: 13 additions & 33 deletions packages/ai/streams/ai-stream.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import {
createParser,
EventSourceMessage,
type EventSourceParser,
type ParsedEvent,
type ReconnectInterval,
} from 'eventsource-parser';

export interface FunctionCallPayload {
Expand Down Expand Up @@ -70,38 +69,38 @@ export interface AIStreamParser {
* @param {AIStreamParser} customParser - Function to handle event data.
* @returns {TransformStream<Uint8Array, string>} TransformStream parsing events.
*/
export function createEventStreamTransformer(
function createEventStreamTransformer(
customParser?: AIStreamParser,
): TransformStream<Uint8Array, string | { isText: false; content: string }> {
const textDecoder = new TextDecoder();
let eventSourceParser: EventSourceParser;

return new TransformStream({
async start(controller): Promise<void> {
eventSourceParser = createParser(
(event: ParsedEvent | ReconnectInterval) => {
eventSourceParser = createParser({
onEvent: (message: EventSourceMessage) => {
if (
('data' in event &&
event.type === 'event' &&
event.data === '[DONE]') ||
('data' in message &&
message.event === 'event' &&
message.data === '[DONE]') ||
// Replicate doesn't send [DONE] but does send a 'done' event
// @see https://replicate.com/docs/streaming
(event as any).event === 'done'
(message as any).event === 'done'
) {
controller.terminate();
return;
}

if ('data' in event) {
if ('data' in message) {
const parsedMessage = customParser
? customParser(event.data, {
event: event.event,
? customParser(message.data, {
event: message.event,
})
: event.data;
: message.data;
if (parsedMessage) controller.enqueue(parsedMessage);
}
},
);
});
},

transform(chunk) {
Expand Down Expand Up @@ -263,22 +262,3 @@ function createEmptyReadableStream(): ReadableStream {
},
});
}

/**
* Implements ReadableStream.from(asyncIterable), which isn't documented in MDN and isn't implemented in node.
* https://github.com/whatwg/streams/commit/8d7a0bf26eb2cc23e884ddbaac7c1da4b91cf2bc
*/
export function readableFromAsyncIterable<T>(iterable: AsyncIterable<T>) {
let it = iterable[Symbol.asyncIterator]();
return new ReadableStream<T>({
async pull(controller) {
const { done, value } = await it.next();
if (done) controller.close();
else controller.enqueue(value);
},

async cancel(reason) {
await it.return?.(reason);
},
});
}
2 changes: 1 addition & 1 deletion packages/provider-utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
},
"dependencies": {
"@ai-sdk/provider": "1.0.0-canary.0",
"eventsource-parser": "^1.1.2",
"eventsource-parser": "^3.0.0",
"nanoid": "^5.0.8",
"secure-json-parse": "^2.7.0"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/provider-utils/src/response-handler.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { APICallError, EmptyResponseBodyError } from '@ai-sdk/provider';
import {
EventSourceParserStream,
ParsedEvent,
EventSourceMessage,
} from 'eventsource-parser/stream';
import { ZodSchema } from 'zod';
import { extractResponseHeaders } from './extract-response-headers';
Expand Down Expand Up @@ -99,7 +99,7 @@ export const createEventSourceResponseHandler =
.pipeThrough(new TextDecoderStream())
.pipeThrough(new EventSourceParserStream())
.pipeThrough(
new TransformStream<ParsedEvent, ParseResult<T>>({
new TransformStream<EventSourceMessage, ParseResult<T>>({
transform({ data }, controller) {
// ignore the 'DONE' event that e.g. OpenAI sends:
if (data === '[DONE]') {
Expand Down
14 changes: 7 additions & 7 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit dce4158

Please sign in to comment.