fix(google-meet): validate api page size

This commit is contained in:
Peter Steinberger
2026-05-29 02:46:50 -04:00
parent 31f3914082
commit 13ac8a0758
2 changed files with 38 additions and 1 deletions

View File

@@ -500,6 +500,31 @@ describe("google-meet CLI", () => {
}
});
it.each(["0", "1.5", "9007199254740993"])(
"rejects invalid Meet API page sizes: %s",
async (pageSize) => {
const fetchMock = vi.fn();
vi.stubGlobal("fetch", fetchMock);
await expect(
setupCli({}).parseAsync(
[
"googlemeet",
"artifacts",
"--access-token",
"token",
"--conference-record",
"rec-1",
"--page-size",
pageSize,
],
{ from: "user" },
),
).rejects.toThrow("page-size must be a positive integer");
expect(fetchMock).not.toHaveBeenCalled();
},
);
it("prints markdown artifact and attendance output", async () => {
stubMeetArtifactsApi();
const tempDir = mkdtempSync(path.join(tmpdir(), "openclaw-google-meet-artifacts-"));

View File

@@ -5,6 +5,7 @@ import { format } from "node:util";
import type { Command } from "commander";
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
import { callGatewayFromCli } from "openclaw/plugin-sdk/gateway-runtime";
import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
import {
buildGoogleMeetCalendarDayWindow,
findGoogleMeetCalendarEvent,
@@ -273,6 +274,17 @@ function parsePositiveNumber(value: string | undefined, label: string): number |
return parsed;
}
function parsePositiveIntegerOption(value: string | undefined, label: string): number | undefined {
if (value === undefined) {
return undefined;
}
const parsed = parseStrictPositiveInteger(value);
if (parsed === undefined) {
throw new Error(`${label} must be a positive integer`);
}
return parsed;
}
async function callGoogleMeetGateway(params: {
callGateway: typeof callGatewayFromCli;
method: GoogleMeetGatewayMethod;
@@ -746,7 +758,7 @@ function resolveArtifactTokenOptions(
refreshToken: options.refreshToken?.trim() || config.oauth.refreshToken,
accessToken: options.accessToken?.trim() || config.oauth.accessToken,
expiresAt: parseOptionalNumber(options.expiresAt) ?? config.oauth.expiresAt,
pageSize: parseOptionalNumber(options.pageSize),
pageSize: parsePositiveIntegerOption(options.pageSize, "page-size"),
includeTranscriptEntries: options.transcriptEntries !== false,
allConferenceRecords: Boolean(options.allConferenceRecords),
includeDocumentBodies: Boolean(options.includeDocBodies),