fix: clear partial Talk startup state (#116067)

This commit is contained in:
Shakker
2026-07-29 21:01:03 +01:00
committed by Shakker
parent a7e881d14f
commit 4849ec4982
2 changed files with 41 additions and 10 deletions
+38
View File
@@ -458,6 +458,44 @@ describe("chat realtime actions", () => {
]);
});
it("clears partial realtime state when session startup fails", async () => {
let rejectStart: (error: Error) => void = () => undefined;
startSpy.mockImplementationOnce(
() =>
new Promise<undefined>((_resolve, reject) => {
rejectStart = reject;
}),
);
const state = createState();
const starting = state.toggleRealtimeTalk();
await vi.waitFor(() => expect(state.realtimeTalkSession).not.toBeNull());
const session = inspectSession(state);
session.callbacks.onStatus?.("listening");
session.callbacks.onVideoCapability?.(true);
session.callbacks.onInputLevel?.(0.8);
session.callbacks.onTranscript?.({ role: "user", text: "partial", final: false });
session.callbacks.onVideoStream?.({} as MediaStream);
state.realtimeTalkCameraDevices = [{ deviceId: "camera", label: "Camera" }];
state.realtimeTalkVideoPending = true;
state.realtimeTalkCameraError = true;
rejectStart(new Error("startup failed"));
await starting;
expect(state.realtimeTalkSession).toBeNull();
expect(state.realtimeTalkActive).toBe(false);
expect(state.realtimeTalkStatus).toBe("error");
expect(state.realtimeTalkDetail).toBe("startup failed");
expect(state.realtimeTalkInputLevel.value).toBe(0);
expect(state.realtimeTalkConversation).toEqual([]);
expect(state.realtimeTalkVideoStream).toBeNull();
expect(state.realtimeTalkCameraDevices).toEqual([]);
expect(state.realtimeTalkVideoCapable).toBe(false);
expect(state.realtimeTalkVideoPending).toBe(false);
expect(state.realtimeTalkCameraError).toBe(false);
});
it("ignores a stopped session that rejects after its replacement starts", async () => {
let rejectFirstStart: (error: Error) => void = () => undefined;
startSpy.mockImplementationOnce(
+3 -10
View File
@@ -261,17 +261,10 @@ export function attachChatRealtimeActions(state: ChatRealtimeState) {
if (state.realtimeTalkSession !== session) {
return;
}
state.realtimeTalkSession = null;
session.stop();
state.realtimeTalkActive = false;
const detail = error instanceof Error ? error.message : String(error);
stopChatRealtimeTalk(state);
state.realtimeTalkStatus = "error";
state.realtimeTalkDetail = error instanceof Error ? error.message : String(error);
state.realtimeTalkInputLevel.set(0);
state.realtimeTalkVideoStream = null;
state.realtimeTalkCameraDevices = [];
state.realtimeTalkVideoCapable = false;
state.realtimeTalkVideoPending = false;
state.realtimeTalkCameraError = false;
state.realtimeTalkDetail = detail;
state.requestUpdate();
}
};