Skip to content

Commit 6500271

Browse files
committed
fix(google-meet): share operation timeout clamp
1 parent 99ffd71 commit 6500271

4 files changed

Lines changed: 53 additions & 18 deletions

File tree

extensions/google-meet/index.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
} from "./src/calendar.js";
2121
import {
2222
resolveGoogleMeetConfig,
23+
resolveGoogleMeetGatewayOperationTimeoutMs,
2324
type GoogleMeetConfig,
2425
type GoogleMeetMode,
2526
type GoogleMeetTransport,
@@ -384,6 +385,7 @@ export const testing = {
384385
googleMeetToolDeps.platform = next ?? (() => process.platform);
385386
},
386387
isGoogleMeetAgentToolActionUnsupportedOnHost,
388+
resolveGoogleMeetGatewayOperationTimeoutMs,
387389
};
388390

389391
/** @deprecated Use `testing`. */
@@ -455,14 +457,6 @@ function assertGoogleMeetAgentToolActionSupported(params: {
455457
);
456458
}
457459

458-
function resolveGoogleMeetToolGatewayTimeoutMs(config: GoogleMeetConfig): number {
459-
return Math.max(
460-
60_000,
461-
config.chrome.joinTimeoutMs + 30_000,
462-
config.voiceCall.requestTimeoutMs + 10_000,
463-
);
464-
}
465-
466460
function readGatewayErrorDetails(err: unknown): unknown {
467461
if (!err || typeof err !== "object" || !("details" in err)) {
468462
return undefined;
@@ -480,7 +474,7 @@ async function callGoogleMeetGatewayFromTool(params: {
480474
googleMeetGatewayMethodForToolAction(params.action),
481475
{
482476
json: true,
483-
timeout: String(resolveGoogleMeetToolGatewayTimeoutMs(params.config)),
477+
timeout: String(resolveGoogleMeetGatewayOperationTimeoutMs(params.config)),
484478
},
485479
params.raw,
486480
{ progress: false },

extensions/google-meet/src/cli.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ import {
1515
listGoogleMeetCalendarEvents,
1616
type GoogleMeetCalendarLookupResult,
1717
} from "./calendar.js";
18-
import type { GoogleMeetConfig, GoogleMeetModeInput, GoogleMeetTransport } from "./config.js";
18+
import {
19+
resolveGoogleMeetGatewayOperationTimeoutMs,
20+
type GoogleMeetConfig,
21+
type GoogleMeetModeInput,
22+
type GoogleMeetTransport,
23+
} from "./config.js";
1924
import { hasCreateSpaceConfigInput, resolveCreateSpaceConfig } from "./create.js";
2025
import {
2126
buildGoogleMeetPreflightReport,
@@ -59,6 +64,7 @@ type OAuthLoginOptions = {
5964

6065
export const testing = {
6166
parsePositiveNumber,
67+
resolveGoogleMeetGatewayOperationTimeoutMs,
6268
resolveGoogleMeetGatewayTimeoutMs,
6369
resolveGoogleMeetOAuthCallbackTimeoutMs,
6470
};
@@ -331,14 +337,6 @@ async function callGoogleMeetGateway(params: {
331337
}
332338
}
333339

334-
function resolveGoogleMeetGatewayOperationTimeoutMs(config: GoogleMeetConfig): number {
335-
return Math.max(
336-
60_000,
337-
config.chrome.joinTimeoutMs + 30_000,
338-
config.voiceCall.requestTimeoutMs + 10_000,
339-
);
340-
}
341-
342340
function formatDuration(value: number | undefined): string {
343341
if (value === undefined) {
344342
return "n/a";
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { MAX_TIMER_TIMEOUT_MS } from "openclaw/plugin-sdk/number-runtime";
2+
import { describe, expect, it } from "vitest";
3+
import { resolveGoogleMeetConfig, resolveGoogleMeetGatewayOperationTimeoutMs } from "./config.js";
4+
5+
describe("google meet gateway operation timeout", () => {
6+
it("adds operation grace to normal transport timeouts", () => {
7+
expect(resolveGoogleMeetGatewayOperationTimeoutMs(resolveGoogleMeetConfig({}))).toBe(60_000);
8+
expect(
9+
resolveGoogleMeetGatewayOperationTimeoutMs(
10+
resolveGoogleMeetConfig({
11+
chrome: { joinTimeoutMs: 120_000 },
12+
voiceCall: { requestTimeoutMs: 30_000 },
13+
}),
14+
),
15+
).toBe(150_000);
16+
});
17+
18+
it("caps overflowed transport timeout grace", () => {
19+
expect(
20+
resolveGoogleMeetGatewayOperationTimeoutMs(
21+
resolveGoogleMeetConfig({
22+
chrome: { joinTimeoutMs: Number.MAX_VALUE },
23+
}),
24+
),
25+
).toBe(MAX_TIMER_TIMEOUT_MS);
26+
expect(
27+
resolveGoogleMeetGatewayOperationTimeoutMs(
28+
resolveGoogleMeetConfig({
29+
voiceCall: { requestTimeoutMs: Number.MAX_VALUE },
30+
}),
31+
),
32+
).toBe(MAX_TIMER_TIMEOUT_MS);
33+
});
34+
});

extensions/google-meet/src/config.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime";
12
import {
23
REALTIME_VOICE_AGENT_CONSULT_TOOL_NAME,
34
resolveRealtimeVoiceAgentConsultToolPolicy,
@@ -91,6 +92,14 @@ export type GoogleMeetConfig = {
9192
};
9293
};
9394

95+
export function resolveGoogleMeetGatewayOperationTimeoutMs(config: GoogleMeetConfig): number {
96+
return Math.max(
97+
60_000,
98+
addTimerTimeoutGraceMs(config.chrome.joinTimeoutMs, 30_000) ?? 1,
99+
addTimerTimeoutGraceMs(config.voiceCall.requestTimeoutMs, 10_000) ?? 1,
100+
);
101+
}
102+
94103
const SOX_DEFAULT_BUFFER_BYTES = 8192;
95104
const SOX_MIN_BUFFER_BYTES = 17;
96105
export const DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES = SOX_DEFAULT_BUFFER_BYTES / 2;

0 commit comments

Comments
 (0)