Skip to content

Commit b021012

Browse files
authored
test(router): add streaming response test (#138)
* test(router): add streaming response test
1 parent 394fd03 commit b021012

1 file changed

Lines changed: 57 additions & 0 deletions

File tree

packages/better-call/src/router.test.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,3 +1125,60 @@ describe("base path", () => {
11251125
expect(text).toBe("hello world");
11261126
});
11271127
});
1128+
1129+
/**
1130+
* @see https://github.com/better-auth/better-call/issues/12
1131+
*/
1132+
describe("streaming response", () => {
1133+
it("returns a Response with a ReadableStream body unchanged from the handler", async () => {
1134+
const encoder = new TextEncoder();
1135+
const messages = ["Message 0\n", "Message 1\n", "Message 2\n"];
1136+
const endpoint = createEndpoint(
1137+
"/ai/realtime",
1138+
{ method: "POST" },
1139+
async () => {
1140+
const queue = [...messages];
1141+
const stream = new ReadableStream({
1142+
pull(controller) {
1143+
const next = queue.shift();
1144+
if (next === undefined) {
1145+
controller.close();
1146+
return;
1147+
}
1148+
controller.enqueue(encoder.encode(next));
1149+
},
1150+
});
1151+
return new Response(stream, {
1152+
status: 200,
1153+
headers: {
1154+
"Content-Type": "application/x-ndjson",
1155+
"Cache-Control": "no-cache",
1156+
},
1157+
});
1158+
},
1159+
);
1160+
const router = createRouter({ endpoint });
1161+
1162+
const res = await router.handler(
1163+
new Request("http://localhost/ai/realtime", { method: "POST" }),
1164+
);
1165+
1166+
expect(res.status).toBe(200);
1167+
expect(res.headers.get("Content-Type")).toBe("application/x-ndjson");
1168+
expect(res.headers.get("Cache-Control")).toBe("no-cache");
1169+
1170+
if (!res.body) {
1171+
throw new Error("Body is null");
1172+
}
1173+
const reader = res.body.getReader();
1174+
const decoder = new TextDecoder();
1175+
let combined = "";
1176+
while (true) {
1177+
const { done, value } = await reader.read();
1178+
if (done) break;
1179+
combined += decoder.decode(value, { stream: true });
1180+
}
1181+
combined += decoder.decode();
1182+
expect(combined).toBe(messages.join(""));
1183+
});
1184+
});

0 commit comments

Comments
 (0)