diff --git a/.changeset/shaggy-singers-promise.md b/.changeset/shaggy-singers-promise.md new file mode 100644 index 000000000000..575aa29cca30 --- /dev/null +++ b/.changeset/shaggy-singers-promise.md @@ -0,0 +1,5 @@ +--- +'@ai-sdk/provider-utils': patch +--- + +fix(provider-utils): fix SSE parser bug (CRLF) diff --git a/packages/provider-utils/src/event-source-parser-stream.test.ts b/packages/provider-utils/src/event-source-parser-stream.test.ts index efa96ba72198..1de5f65e73d1 100644 --- a/packages/provider-utils/src/event-source-parser-stream.test.ts +++ b/packages/provider-utils/src/event-source-parser-stream.test.ts @@ -43,6 +43,12 @@ describe('EventSourceParserStream', () => { ]); }); + it('should handle CRLF lines correctly', async () => { + expect(await parseStream(['data: sup?\r\nevent: hey\n\n'])).toEqual([ + { data: 'sup?', event: 'hey' }, + ]); + }); + it('should handle CRLF line endings', async () => { expect(await parseStream(['data: hello\r\n\r\n'])).toEqual([ { data: 'hello' }, diff --git a/packages/provider-utils/src/event-source-parser-stream.ts b/packages/provider-utils/src/event-source-parser-stream.ts index c0ccb1208631..48bad31da760 100644 --- a/packages/provider-utils/src/event-source-parser-stream.ts +++ b/packages/provider-utils/src/event-source-parser-stream.ts @@ -120,8 +120,7 @@ function splitLines(buffer: string, chunk: string) { } else if (char === '\r') { lines.push(currentLine); currentLine = ''; - - if (chunk[i + 1] === '\n') { + if (chunk[i] === '\n') { i++; // CRLF case: Skip the LF character } } else {