import { formatCliCommand } from "../../../src/cli/command-format.js"; import type { PollInput } from "../../../src/polls.js"; import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; export type ActiveWebSendOptions = { gifPlayback?: boolean; accountId?: string; fileName?: string; }; export type ActiveWebListener = { sendMessage: ( to: string, text: string, mediaBuffer?: Buffer, mediaType?: string, options?: ActiveWebSendOptions, ) => Promise<{ messageId: string }>; sendPoll: (to: string, poll: PollInput) => Promise<{ messageId: string }>; sendReaction: ( chatJid: string, messageId: string, emoji: string, fromMe: boolean, participant?: string, ) => Promise; sendComposingTo: (to: string) => Promise; close?: () => Promise; }; let _currentListener: ActiveWebListener | null = null; const listeners = new Map(); export function resolveWebAccountId(accountId?: string | null): string { return (accountId ?? "").trim() || DEFAULT_ACCOUNT_ID; } export function requireActiveWebListener(accountId?: string | null): { accountId: string; listener: ActiveWebListener; } { const id = resolveWebAccountId(accountId); const listener = listeners.get(id) ?? null; if (!listener) { throw new Error( `No active WhatsApp Web listener (account: ${id}). Start the gateway, then link WhatsApp with: ${formatCliCommand(`remoteclaw channels login --channel whatsapp --account ${id}`)}.`, ); } return { accountId: id, listener }; } export function setActiveWebListener(listener: ActiveWebListener | null): void; export function setActiveWebListener( accountId: string | null | undefined, listener: ActiveWebListener | null, ): void; export function setActiveWebListener( accountIdOrListener: string | ActiveWebListener | null | undefined, maybeListener?: ActiveWebListener | null, ): void { const { accountId, listener } = typeof accountIdOrListener === "string" ? { accountId: accountIdOrListener, listener: maybeListener ?? null } : { accountId: DEFAULT_ACCOUNT_ID, listener: accountIdOrListener ?? null, }; const id = resolveWebAccountId(accountId); if (!listener) { listeners.delete(id); } else { listeners.set(id, listener); } if (id === DEFAULT_ACCOUNT_ID) { _currentListener = listener; } } export function getActiveWebListener(accountId?: string | null): ActiveWebListener | null { const id = resolveWebAccountId(accountId); return listeners.get(id) ?? null; }