import { listChannelPlugins } from "../../channels/plugins/index.js"; import { ErrorCodes, errorShape, formatValidationErrors, validateWebLoginStartParams, validateWebLoginWaitParams, } from "../protocol/index.js"; import { formatForLog } from "../ws-log.js"; import type { GatewayRequestHandlers } from "./types.js"; const WEB_LOGIN_METHODS = new Set(["web.login.start", "web.login.wait"]); const resolveWebLoginProvider = () => listChannelPlugins().find((plugin) => (plugin.gatewayMethods ?? []).some((method) => WEB_LOGIN_METHODS.has(method)), ) ?? null; export const webHandlers: GatewayRequestHandlers = { "web.login.start": async ({ params, respond, context }) => { if (!validateWebLoginStartParams(params)) { respond( false, undefined, errorShape( ErrorCodes.INVALID_REQUEST, `invalid web.login.start params: ${formatValidationErrors(validateWebLoginStartParams.errors)}`, ), ); return; } try { const accountId = typeof (params as { accountId?: unknown }).accountId === "string" ? (params as { accountId?: string }).accountId : undefined; const provider = resolveWebLoginProvider(); if (!provider) { respond( false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "web login provider is not available"), ); return; } await context.stopChannel(provider.id, accountId); if (!provider.gateway?.loginWithQrStart) { respond( false, undefined, errorShape( ErrorCodes.INVALID_REQUEST, `web login is not supported by provider ${provider.id}`, ), ); return; } const result = await provider.gateway.loginWithQrStart({ force: Boolean((params as { force?: boolean }).force), timeoutMs: typeof (params as { timeoutMs?: unknown }).timeoutMs === "number" ? (params as { timeoutMs?: number }).timeoutMs : undefined, verbose: Boolean((params as { verbose?: boolean }).verbose), accountId, }); respond(true, result, undefined); } catch (err) { respond(false, undefined, errorShape(ErrorCodes.UNAVAILABLE, formatForLog(err))); } }, "web.login.wait": async ({ params, respond, context }) => { if (!validateWebLoginWaitParams(params)) { respond( false, undefined, errorShape( ErrorCodes.INVALID_REQUEST, `invalid web.login.wait params: ${formatValidationErrors(validateWebLoginWaitParams.errors)}`, ), ); return; } try { const accountId = typeof (params as { accountId?: unknown }).accountId === "string" ? (params as { accountId?: string }).accountId : undefined; const provider = resolveWebLoginProvider(); if (!provider) { respond( false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "web login provider is not available"), ); return; } if (!provider.gateway?.loginWithQrWait) { respond( false, undefined, errorShape( ErrorCodes.INVALID_REQUEST, `web login is not supported by provider ${provider.id}`, ), ); return; } const result = await provider.gateway.loginWithQrWait({ timeoutMs: typeof (params as { timeoutMs?: unknown }).timeoutMs === "number" ? (params as { timeoutMs?: number }).timeoutMs : undefined, accountId, }); if (result.connected) { await context.startChannel(provider.id, accountId); } respond(true, result, undefined); } catch (err) { respond(false, undefined, errorShape(ErrorCodes.UNAVAILABLE, formatForLog(err))); } }, };