diff --git a/src/gateway/server-methods/config.ts b/src/gateway/server-methods/config.ts index 9fc09737a..e0bc6c891 100644 --- a/src/gateway/server-methods/config.ts +++ b/src/gateway/server-methods/config.ts @@ -38,6 +38,7 @@ import { validateConfigSetParams, } from "../protocol/index.js"; import { resolveBaseHashParam } from "./base-hash.js"; +import { parseRestartRequestParams } from "./restart-request.js"; import { assertValidParams } from "./validation.js"; function requireConfigBaseHash( @@ -152,19 +153,7 @@ function resolveConfigRestartRequest(params: unknown): { deliveryContext: ReturnType["deliveryContext"]; threadId: ReturnType["threadId"]; } { - const sessionKey = - typeof (params as { sessionKey?: unknown }).sessionKey === "string" - ? (params as { sessionKey?: string }).sessionKey?.trim() || undefined - : undefined; - const note = - typeof (params as { note?: unknown }).note === "string" - ? (params as { note?: string }).note?.trim() || undefined - : undefined; - const restartDelayMsRaw = (params as { restartDelayMs?: unknown }).restartDelayMs; - const restartDelayMs = - typeof restartDelayMsRaw === "number" && Number.isFinite(restartDelayMsRaw) - ? Math.max(0, Math.floor(restartDelayMsRaw)) - : undefined; + const { sessionKey, note, restartDelayMs } = parseRestartRequestParams(params); // Extract deliveryContext + threadId for routing after restart // Supports both :thread: (most channels) and :topic: (Telegram) diff --git a/src/gateway/server-methods/restart-request.ts b/src/gateway/server-methods/restart-request.ts new file mode 100644 index 000000000..f8b2ddb8c --- /dev/null +++ b/src/gateway/server-methods/restart-request.ts @@ -0,0 +1,20 @@ +export function parseRestartRequestParams(params: unknown): { + sessionKey: string | undefined; + note: string | undefined; + restartDelayMs: number | undefined; +} { + const sessionKey = + typeof (params as { sessionKey?: unknown }).sessionKey === "string" + ? (params as { sessionKey?: string }).sessionKey?.trim() || undefined + : undefined; + const note = + typeof (params as { note?: unknown }).note === "string" + ? (params as { note?: string }).note?.trim() || undefined + : undefined; + const restartDelayMsRaw = (params as { restartDelayMs?: unknown }).restartDelayMs; + const restartDelayMs = + typeof restartDelayMsRaw === "number" && Number.isFinite(restartDelayMsRaw) + ? Math.max(0, Math.floor(restartDelayMsRaw)) + : undefined; + return { sessionKey, note, restartDelayMs }; +} diff --git a/src/gateway/server-methods/update.ts b/src/gateway/server-methods/update.ts index 64d5fc765..411077444 100644 --- a/src/gateway/server-methods/update.ts +++ b/src/gateway/server-methods/update.ts @@ -10,6 +10,7 @@ import { scheduleGatewaySigusr1Restart } from "../../infra/restart.js"; import { normalizeUpdateChannel } from "../../infra/update-channels.js"; import { runGatewayUpdate } from "../../infra/update-runner.js"; import { validateUpdateRunParams } from "../protocol/index.js"; +import { parseRestartRequestParams } from "./restart-request.js"; import { assertValidParams } from "./validation.js"; export const updateHandlers: GatewayRequestHandlers = { @@ -17,19 +18,7 @@ export const updateHandlers: GatewayRequestHandlers = { if (!assertValidParams(params, validateUpdateRunParams, "update.run", respond)) { return; } - const sessionKey = - typeof (params as { sessionKey?: unknown }).sessionKey === "string" - ? (params as { sessionKey?: string }).sessionKey?.trim() || undefined - : undefined; - const note = - typeof (params as { note?: unknown }).note === "string" - ? (params as { note?: string }).note?.trim() || undefined - : undefined; - const restartDelayMsRaw = (params as { restartDelayMs?: unknown }).restartDelayMs; - const restartDelayMs = - typeof restartDelayMsRaw === "number" && Number.isFinite(restartDelayMsRaw) - ? Math.max(0, Math.floor(restartDelayMsRaw)) - : undefined; + const { sessionKey, note, restartDelayMs } = parseRestartRequestParams(params); const timeoutMsRaw = (params as { timeoutMs?: unknown }).timeoutMs; const timeoutMs = typeof timeoutMsRaw === "number" && Number.isFinite(timeoutMsRaw)