import { ChannelsStatusSnapshot } from "../types.ts" ;
import type { ChannelsState } from "./channels.types.ts" ;
import {
formatMissingOperatorReadScopeMessage,
isMissingOperatorReadScopeError,
} from "./scope-errors.ts" ;
export type { ChannelsState };
export async function loadChannels(state: ChannelsState, probe: boolean ) {
if (!state.client || !state.connected) {
return ;
}
if (state.channelsLoading) {
return ;
}
state.channelsLoading = true ;
state.channelsError = null ;
try {
const res = await state.client.request<ChannelsStatusSnapshot | null >("channels.status" , {
probe,
timeoutMs: 8000 ,
});
state.channelsSnapshot = res;
state.channelsLastSuccess = Date.now();
} catch (err) {
if (isMissingOperatorReadScopeError(err)) {
state.channelsSnapshot = null ;
state.channelsError = formatMissingOperatorReadScopeMessage("channel status" );
} else {
state.channelsError = String(err);
}
} finally {
state.channelsLoading = false ;
}
}
export async function startWhatsAppLogin(state: ChannelsState, force: boolean ) {
if (!state.client || !state.connected || state.whatsappBusy) {
return ;
}
state.whatsappBusy = true ;
try {
const res = await state.client.request<{
message?: string;
qrDataUrl?: string;
connected?: boolean ;
}>("web.login.start" , {
force,
timeoutMs: 30000 ,
});
state.whatsappLoginMessage = res.message ?? null ;
state.whatsappLoginQrDataUrl = res.qrDataUrl ?? null ;
state.whatsappLoginConnected = typeof res.connected === "boolean" ? res.connected : null ;
} catch (err) {
state.whatsappLoginMessage = String(err);
state.whatsappLoginQrDataUrl = null ;
state.whatsappLoginConnected = null ;
} finally {
state.whatsappBusy = false ;
}
}
export async function waitWhatsAppLogin(state: ChannelsState) {
if (!state.client || !state.connected || state.whatsappBusy) {
return ;
}
state.whatsappBusy = true ;
try {
const res = await state.client.request<{
message?: string;
connected?: boolean ;
qrDataUrl?: string;
}>("web.login.wait" , {
timeoutMs: 120000 ,
currentQrDataUrl: state.whatsappLoginQrDataUrl ?? undefined,
});
state.whatsappLoginMessage = res.message ?? null ;
state.whatsappLoginConnected = res.connected ?? null ;
if (res.qrDataUrl) {
state.whatsappLoginQrDataUrl = res.qrDataUrl;
} else if (res.connected) {
state.whatsappLoginQrDataUrl = null ;
}
} catch (err) {
state.whatsappLoginMessage = String(err);
state.whatsappLoginConnected = null ;
} finally {
state.whatsappBusy = false ;
}
}
export async function logoutWhatsApp(state: ChannelsState) {
if (!state.client || !state.connected || state.whatsappBusy) {
return ;
}
state.whatsappBusy = true ;
try {
await state.client.request("channels.logout" , { channel: "whatsapp" });
state.whatsappLoginMessage = "Logged out." ;
state.whatsappLoginQrDataUrl = null ;
state.whatsappLoginConnected = null ;
} catch (err) {
state.whatsappLoginMessage = String(err);
} finally {
state.whatsappBusy = false ;
}
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland