amos-fernandes's picture
Upload 4501 files
3a65265 verified
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)));
}
},
};