Files
openclaw/src/cli/parse-timeout.ts
2026-05-24 03:55:49 +01:00

68 lines
1.5 KiB
TypeScript

export function parseTimeoutMs(raw: unknown): number | undefined {
if (raw === undefined || raw === null) {
return undefined;
}
let value = Number.NaN;
if (typeof raw === "number") {
value = raw;
} else if (typeof raw === "bigint") {
value = Number(raw);
} else if (typeof raw === "string") {
const trimmed = raw.trim();
if (!trimmed) {
return undefined;
}
if (!/^\d+$/u.test(trimmed)) {
return undefined;
}
value = Number(trimmed);
}
return Number.isSafeInteger(value) && value > 0 ? value : undefined;
}
function invalidTimeout(value?: string): Error {
const suffix = value ? ` Received: "${value}".` : "";
return new Error(
`Invalid --timeout. Use a positive millisecond value, e.g. --timeout 30000.${suffix}`,
);
}
export function parseTimeoutMsWithFallback(
raw: unknown,
fallbackMs: number,
options: {
invalidType?: "fallback" | "error";
} = {},
): number {
if (raw === undefined || raw === null) {
return fallbackMs;
}
const value =
typeof raw === "string"
? raw.trim()
: typeof raw === "number" || typeof raw === "bigint"
? String(raw)
: null;
if (value === null) {
if (options.invalidType === "error") {
throw invalidTimeout();
}
return fallbackMs;
}
if (!value) {
return fallbackMs;
}
if (!/^\d+$/u.test(value)) {
throw invalidTimeout(value);
}
const parsed = Number(value);
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
throw invalidTimeout(value);
}
return parsed;
}