Ctrl K
ComunidadGuías…

lib/assistant-event-stream.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { describe, expect, it, vi } from "vitest";
import { createAssistantEventStream } from "./assistant-event-stream";

describe("assistant SSE transport", () => {
  it("preserves events and UTF-8 text across every byte boundary", () => {
    const onEvent = vi.fn();
    const stream = createAssistantEventStream(onEvent);
    const bytes = new TextEncoder().encode(
      'event: content_delta\r\ndata: {"delta":"Héllo"}\r\n\r\n'
      + 'event: done\ndata: {"status":"completed"}\n\n',
    );
    for (const byte of bytes) stream.push(new Uint8Array([byte]));
    stream.finish();
    expect(onEvent.mock.calls).toEqual([
      ["content_delta", { delta: "Héllo" }],
      ["done", { status: "completed" }],
    ]);
  });

  it("delivers text before completion when event and data arrive separately", () => {
    const onEvent = vi.fn();
    const stream = createAssistantEventStream(onEvent);
    const encode = (text: string) => new TextEncoder().encode(text);
    stream.push(encode("event: content_delta\n"));
    expect(onEvent).not.toHaveBeenCalled();
    stream.push(encode('data: {"delta":"first token"}\n\n'));
    expect(onEvent).toHaveBeenCalledWith("content_delta", { delta: "first token" });
  });

  it("keeps the next event after malformed data and accepts multiline data", () => {
    const onEvent = vi.fn();
    const stream = createAssistantEventStream(onEvent);
    stream.push(new TextEncoder().encode(
      'event: content_delta\ndata: broken\n\n'
      + ': keepalive\nevent: done\ndata: {\ndata: "status":"completed"}\n\n',
    ));
    expect(onEvent.mock.calls).toEqual([["done", { status: "completed" }]]);
  });
});