

























@@ -15,6 +15,7 @@ afterEach(async () => {
1515async function createRealtimeServer(params?: {
1616closeOnConnection?: boolean;
1717initialEvent?: unknown;
18+initialText?: string;
1819onUpgrade?: (headers: Record<string, string | string[] | undefined>) => void;
1920onBinary?: (payload: Buffer) => void;
2021onText?: (payload: unknown) => void;
@@ -35,6 +36,9 @@ async function createRealtimeServer(params?: {
3536if (params?.initialEvent) {
3637ws.send(JSON.stringify(params.initialEvent));
3738}
39+if (params?.initialText) {
40+ws.send(params.initialText);
41+}
3842ws.on("message", (data, isBinary) => {
3943const buffer = Buffer.isBuffer(data)
4044 ? data
@@ -257,6 +261,32 @@ describe("createRealtimeTranscriptionWebSocketSession", () => {
257261expect(setupError.message).toBe("nope");
258262});
259263264+it("reports malformed websocket JSON with an owned parser error", async () => {
265+const server = await createRealtimeServer({ initialText: "{not json" });
266+const onError = vi.fn();
267+const session = createRealtimeTranscriptionWebSocketSession({
268+providerId: "test",
269+callbacks: { onError },
270+url: server.url,
271+readyOnOpen: true,
272+onMessage: () => {
273+throw new Error("malformed payload should not reach provider handler");
274+},
275+sendAudio: (audio, transport) => {
276+transport.sendBinary(audio);
277+},
278+});
279+280+await session.connect();
281+await vi.waitFor(() => {
282+expect(onError).toHaveBeenCalledTimes(1);
283+});
284+const parseError = requireFirstMockArg(onError, "malformed websocket json error");
285+expect(parseError).toBeInstanceOf(Error);
286+expect(parseError.message).toBe("Realtime transcription websocket received malformed JSON.");
287+session.close();
288+});
289+260290it("reports pre-ready closes separately from connection timeouts", async () => {
261291const server = await createRealtimeServer({ closeOnConnection: true });
262292const onError = vi.fn();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。