test(perf): bound google meet retry waits

This commit is contained in:
Peter Steinberger
2026-05-06 15:25:22 +01:00
parent 298cae67bb
commit 2e10ffe813
3 changed files with 46 additions and 36 deletions

View File

@@ -2885,11 +2885,14 @@ describe("google-meet plugin", () => {
}) => Promise<void>)
| 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 () => {

View File

@@ -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;

View File

@@ -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 };
}