

























@@ -13,6 +13,7 @@ afterEach(async () => {
1313});
14141515async function createRealtimeServer(params?: {
16+closeOnConnection?: boolean;
1617initialEvent?: unknown;
1718onBinary?: (payload: Buffer) => void;
1819onText?: (payload: unknown) => void;
@@ -25,6 +26,10 @@ async function createRealtimeServer(params?: {
2526wss.handleUpgrade(request, socket, head, (ws) => {
2627clients.add(ws);
2728ws.on("close", () => clients.delete(ws));
29+if (params?.closeOnConnection) {
30+ws.close(1011, "setup failed");
31+return;
32+}
2833if (params?.initialEvent) {
2934ws.send(JSON.stringify(params.initialEvent));
3035}
@@ -153,4 +158,27 @@ describe("createRealtimeTranscriptionWebSocketSession", () => {
153158expect(session.isConnected()).toBe(false);
154159expect(onError).toHaveBeenCalledWith(expect.any(Error));
155160});
161+162+it("reports pre-ready closes separately from connection timeouts", async () => {
163+const server = await createRealtimeServer({ closeOnConnection: true });
164+const onError = vi.fn();
165+const session = createRealtimeTranscriptionWebSocketSession({
166+providerId: "test",
167+callbacks: { onError },
168+url: server.url,
169+connectTimeoutMessage: "test realtime transcription connection timeout",
170+connectClosedBeforeReadyMessage: "test realtime transcription connection closed before ready",
171+sendAudio: (audio, transport) => {
172+transport.sendBinary(audio);
173+},
174+});
175+176+await expect(session.connect()).rejects.toThrow(
177+"test realtime transcription connection closed before ready",
178+);
179+expect(onError).toHaveBeenCalledWith(expect.any(Error));
180+expect(onError.mock.calls[0]?.[0]).toMatchObject({
181+message: "test realtime transcription connection closed before ready",
182+});
183+});
156184});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。