mirror of https://github.com/langgenius/dify.git
77 lines
2.5 KiB
JavaScript
77 lines
2.5 KiB
JavaScript
import { Readable } from "node:stream";
|
|
import { describe, expect, it } from "vitest";
|
|
import { createBinaryStream, createSseStream, parseSseStream } from "./sse";
|
|
|
|
describe("sse parsing", () => {
|
|
it("parses event and data lines", async () => {
|
|
const stream = Readable.from([
|
|
"event: message\n",
|
|
"data: {\"answer\":\"hi\"}\n",
|
|
"\n",
|
|
]);
|
|
const events = [];
|
|
for await (const event of parseSseStream(stream)) {
|
|
events.push(event);
|
|
}
|
|
expect(events).toHaveLength(1);
|
|
expect(events[0].event).toBe("message");
|
|
expect(events[0].data).toEqual({ answer: "hi" });
|
|
});
|
|
|
|
it("handles multi-line data payloads", async () => {
|
|
const stream = Readable.from(["data: line1\n", "data: line2\n", "\n"]);
|
|
const events = [];
|
|
for await (const event of parseSseStream(stream)) {
|
|
events.push(event);
|
|
}
|
|
expect(events[0].raw).toBe("line1\nline2");
|
|
expect(events[0].data).toBe("line1\nline2");
|
|
});
|
|
|
|
it("createSseStream exposes toText", async () => {
|
|
const stream = Readable.from([
|
|
"data: {\"answer\":\"hello\"}\n\n",
|
|
"data: {\"delta\":\" world\"}\n\n",
|
|
]);
|
|
const sseStream = createSseStream(stream, {
|
|
status: 200,
|
|
headers: {},
|
|
requestId: "req",
|
|
});
|
|
const text = await sseStream.toText();
|
|
expect(text).toBe("hello world");
|
|
});
|
|
|
|
it("toText extracts text from string data", async () => {
|
|
const stream = Readable.from(["data: plain text\n\n"]);
|
|
const sseStream = createSseStream(stream, { status: 200, headers: {} });
|
|
const text = await sseStream.toText();
|
|
expect(text).toBe("plain text");
|
|
});
|
|
|
|
it("toText extracts text field from object", async () => {
|
|
const stream = Readable.from(['data: {"text":"hello"}\n\n']);
|
|
const sseStream = createSseStream(stream, { status: 200, headers: {} });
|
|
const text = await sseStream.toText();
|
|
expect(text).toBe("hello");
|
|
});
|
|
|
|
it("toText returns empty for invalid data", async () => {
|
|
const stream = Readable.from(["data: null\n\n", "data: 123\n\n"]);
|
|
const sseStream = createSseStream(stream, { status: 200, headers: {} });
|
|
const text = await sseStream.toText();
|
|
expect(text).toBe("");
|
|
});
|
|
|
|
it("createBinaryStream exposes metadata", () => {
|
|
const stream = Readable.from(["chunk"]);
|
|
const binary = createBinaryStream(stream, {
|
|
status: 200,
|
|
headers: { "content-type": "audio/mpeg" },
|
|
requestId: "req",
|
|
});
|
|
expect(binary.status).toBe(200);
|
|
expect(binary.headers["content-type"]).toBe("audio/mpeg");
|
|
});
|
|
});
|