























@@ -21,6 +21,10 @@ async function createRealtimeSttServer(params?: {
2121const wss = new WebSocketServer({ noServer: true });
2222const clients = new Set<WebSocket>();
2323const done = vi.fn();
24+let resolveDone: (() => void) | undefined;
25+const donePromise = new Promise<void>((resolve) => {
26+resolveDone = resolve;
27+});
24282529server.on("upgrade", (request, socket, head) => {
2630const url = new URL(request.url ?? "/", "http://127.0.0.1");
@@ -59,6 +63,7 @@ async function createRealtimeSttServer(params?: {
5963if (event.type === "audio.done") {
6064ws.send(JSON.stringify({ type: "transcript.done", text: "hello openclaw final" }));
6165done();
66+resolveDone?.();
6267}
6368});
6469});
@@ -73,22 +78,7 @@ async function createRealtimeSttServer(params?: {
7378await new Promise<void>((resolve) => wss.close(() => resolve()));
7479await new Promise<void>((resolve) => server.close(() => resolve()));
7580};
76-return { baseUrl: `http://127.0.0.1:${port}/v1`, done };
77-}
78-79-async function waitFor(expectation: () => void) {
80-const started = Date.now();
81-let lastError: unknown;
82-while (Date.now() - started < 3000) {
83-try {
84-expectation();
85-return;
86-} catch (error) {
87-lastError = error;
88-await new Promise((resolve) => setTimeout(resolve, 25));
89-}
90-}
91-throw lastError;
81+return { baseUrl: `http://127.0.0.1:${port}/v1`, done, donePromise };
9282}
93839484describe("xai realtime transcription provider", () => {
@@ -132,7 +122,15 @@ describe("xai realtime transcription provider", () => {
132122});
133123const provider = buildXaiRealtimeTranscriptionProvider();
134124const onPartial = vi.fn();
135-const onTranscript = vi.fn();
125+let resolveFinalTranscript: (() => void) | undefined;
126+const finalTranscript = new Promise<void>((resolve) => {
127+resolveFinalTranscript = resolve;
128+});
129+const onTranscript = vi.fn((text: string) => {
130+if (text === "hello openclaw final") {
131+resolveFinalTranscript?.();
132+}
133+});
136134const onSpeechStart = vi.fn();
137135138136const session = provider.createSession({
@@ -151,9 +149,9 @@ describe("xai realtime transcription provider", () => {
151149session.sendAudio(Buffer.from("queued-before-ready"));
152150await session.connect();
153151session.sendAudio(Buffer.from("after-ready"));
154-await waitFor(() => expect(onTranscript).toHaveBeenCalledWith("hello openclaw final"));
152+await finalTranscript;
155153session.close();
156-await waitFor(() => expect(server.done).toHaveBeenCalled());
154+await server.donePromise;
157155158156expect(requestUrls[0]?.pathname).toBe("/v1/stt");
159157expect(requestUrls[0]?.searchParams.get("sample_rate")).toBe("24000");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。