Spaces:
Configuration error
Configuration error
| 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))); | |
| } | |
| }, | |
| }; | |