File size: 1,362 Bytes
131b00f
 
 
 
 
 
 
 
 
 
 
 
 
8b26281
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131b00f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { describe, it, expect } from 'vitest';
import { parseSseChunk } from './api';

describe('parseSseChunk', () => {
  it('parses buffered SSE events and returns the remainder', () => {
    const { events, rest } = parseSseChunk(
      'event: token\ndata: {"text":"He"}\n\nevent: token\ndata: {"text":"y"}\n\nevent: do');
    expect(events).toEqual([
      { event: 'token', data: { text: 'He' } },
      { event: 'token', data: { text: 'y' } },
    ]);
    expect(rest).toBe('event: do');
  });

  it('parses CRLF-framed events (sse-starlette sends \\r\\n line endings)', () => {
    const { events, rest } = parseSseChunk(
      'event: stage\r\ndata: {"index":0,"status":"active"}\r\n\r\nevent: stage\r\ndata: {"index":0,"status":"done"}\r\n\r\nevent: re');
    expect(events).toEqual([
      { event: 'stage', data: { index: 0, status: 'active' } },
      { event: 'stage', data: { index: 0, status: 'done' } },
    ]);
    expect(rest).toBe('event: re');
  });

  it('holds a partial CRLF separator at a chunk boundary in the remainder', () => {
    const first = parseSseChunk('event: token\r\ndata: {"text":"x"}\r\n\r');
    expect(first.events).toEqual([]);
    const second = parseSseChunk(first.rest + '\nevent: t');
    expect(second.events).toEqual([{ event: 'token', data: { text: 'x' } }]);
    expect(second.rest).toBe('event: t');
  });
});