From 2e10ffe8130d5d444a69b0b58ee9017079f0d996 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 6 May 2026 15:25:22 +0100 Subject: [PATCH] test(perf): bound google meet retry waits --- extensions/google-meet/index.test.ts | 73 +++++++++++-------- extensions/google-meet/src/runtime.ts | 2 +- .../google-meet/src/transports/chrome.ts | 7 +- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/extensions/google-meet/index.test.ts b/extensions/google-meet/index.test.ts index db35bf2c858..def5a1a7da9 100644 --- a/extensions/google-meet/index.test.ts +++ b/extensions/google-meet/index.test.ts @@ -2885,11 +2885,14 @@ describe("google-meet plugin", () => { }) => Promise) | undefined; const respond = vi.fn(); + vi.useFakeTimers(); - await handler?.({ + const run = handler?.({ params: { url: "https://meet.google.com/abc-defg-hij" }, respond, }); + await vi.advanceTimersByTimeAsync(2_000); + await run; expect(respond.mock.calls[0]?.[1]).toMatchObject({ spoken: false, @@ -2905,6 +2908,7 @@ describe("google-meet plugin", () => { }); expect(inspectCount).toBeGreaterThanOrEqual(2); } finally { + vi.useRealTimers(); Object.defineProperty(process, "platform", { value: originalPlatform }); } }); @@ -4831,6 +4835,7 @@ describe("google-meet plugin", () => { }); it("stops paired-node realtime audio after repeated input pull failures", async () => { + vi.useFakeTimers(); const bridge = { connect: vi.fn(async () => {}), sendAudio: vi.fn(), @@ -4860,38 +4865,42 @@ describe("google-meet plugin", () => { }, }; - const handle = await startNodeRealtimeAudioBridge({ - config: resolveGoogleMeetConfig({ - realtime: { provider: "openai", model: "gpt-realtime" }, - }), - fullConfig: {} as never, - runtime: runtime as never, - meetingSessionId: "meet-1", - nodeId: "node-1", - bridgeId: "bridge-1", - logger: noopLogger, - providers: [provider], - }); - - await vi.waitFor( - () => { - expect(bridge.close).toHaveBeenCalled(); - }, - { timeout: 3_000 }, - ); - expect(handle.getHealth()).toMatchObject({ - bridgeClosed: true, - consecutiveInputErrors: 5, - lastInputError: "node invoke timeout", - }); - expect(runtime.nodes.invoke).toHaveBeenCalledWith( - expect.objectContaining({ + try { + const handle = await startNodeRealtimeAudioBridge({ + config: resolveGoogleMeetConfig({ + realtime: { provider: "openai", model: "gpt-realtime" }, + }), + fullConfig: {} as never, + runtime: runtime as never, + meetingSessionId: "meet-1", nodeId: "node-1", - command: "googlemeet.chrome", - params: { action: "stop", bridgeId: "bridge-1" }, - timeoutMs: 5_000, - }), - ); + bridgeId: "bridge-1", + logger: noopLogger, + providers: [provider], + }); + + await vi.waitFor( + () => { + expect(bridge.close).toHaveBeenCalled(); + }, + { timeout: 3_000 }, + ); + expect(handle.getHealth()).toMatchObject({ + bridgeClosed: true, + consecutiveInputErrors: 5, + lastInputError: "node invoke timeout", + }); + expect(runtime.nodes.invoke).toHaveBeenCalledWith( + expect.objectContaining({ + nodeId: "node-1", + command: "googlemeet.chrome", + params: { action: "stop", bridgeId: "bridge-1" }, + timeoutMs: 5_000, + }), + ); + } finally { + vi.useRealTimers(); + } }); it("exposes node-host list and stop-by-url bridge actions", async () => { diff --git a/extensions/google-meet/src/runtime.ts b/extensions/google-meet/src/runtime.ts index 601636a9050..0bcc6e01f0a 100644 --- a/extensions/google-meet/src/runtime.ts +++ b/extensions/google-meet/src/runtime.ts @@ -634,7 +634,7 @@ export class GoogleMeetRuntime { ); const deadline = Date.now() + waitMs; while (Date.now() < deadline) { - await sleep(250); + await sleep(Math.min(250, Math.max(0, deadline - Date.now()))); result = await this.speak(session.id, instructions); if (result.spoken) { return true; diff --git a/extensions/google-meet/src/transports/chrome.ts b/extensions/google-meet/src/transports/chrome.ts index 5d47fd29dbf..8ce209fe4b4 100644 --- a/extensions/google-meet/src/transports/chrome.ts +++ b/extensions/google-meet/src/transports/chrome.ts @@ -753,10 +753,11 @@ async function openMeetWithBrowserRequest(params: { }; break; } - if (Date.now() <= deadline) { - await new Promise((resolve) => setTimeout(resolve, 750)); + const remainingWaitMs = deadline - Date.now(); + if (remainingWaitMs > 0) { + await new Promise((resolve) => setTimeout(resolve, Math.min(750, remainingWaitMs))); } - } while (Date.now() <= deadline); + } while (Date.now() < deadline); return { launched: true, browser }; }