// Типобезопасные обёртки над Tauri-командами. // Единая точка вызова бэкенда — компоненты не дёргают invoke напрямую. import { invoke } from "@tauri-apps/api/core"; import type { AndroidInstalledApp, ConnectionState, Outbound, Profile, Settings, Subscription, } from "./types"; export const ipc = { /** Версия sidecar sing-box (первая строка вывода `sing-box version`). */ singboxVersion: () => invoke("singbox_version"), /** Текущие настройки (или значения по умолчанию, если файла нет). */ getSettings: () => invoke("get_settings"), /** Сохраняет настройки на диск, возвращает сохранённое значение. */ saveSettings: (settings: Settings) => invoke("save_settings", { settings }), /** Все профили. */ listProfiles: () => invoke("list_profiles"), /** Создаёт профиль (id назначает бэкенд). */ createProfile: (name: string, outbound: Outbound) => invoke("create_profile", { name, outbound }), /** Обновляет существующий профиль по id. */ updateProfile: (profile: Profile) => invoke("update_profile", { profile }), /** Удаляет профиль по id. */ deleteProfile: (id: string) => invoke("delete_profile", { id }), /** Дублирует профиль по id. */ duplicateProfile: (id: string) => invoke("duplicate_profile", { id }), /** Импортирует профиль из ссылки (hysteria2://) или JSON sing-box. */ importProfile: (input: string, name?: string) => invoke("import_profile", { input, name: name ?? null }), /** Экспортирует профиль: format="link" — share-ссылка (включая vpn:// для AWG), "json" — конфиг. */ exportProfile: (id: string, format: "link" | "json") => invoke("export_profile", { id, format }), /** Все подписки. */ listSubscriptions: () => invoke("list_subscriptions"), /** Добавляет подписку (скачивает список серверов → профили). */ addSubscription: (name: string, url: string) => invoke("add_subscription", { name, url }), /** Обновляет подписку (перекачивает список). */ updateSubscription: (id: string) => invoke("update_subscription", { id }), /** Удаляет подписку вместе с её профилями. */ deleteSubscription: (id: string) => invoke("delete_subscription", { id }), /** Подключается через профиль (proxy mode). */ connect: (profileId: string) => invoke("connect", { profileId }), /** Отключается. */ disconnect: () => invoke("disconnect"), /** Текущее состояние подключения. */ getConnectionState: () => invoke("get_connection_state"), /** Адрес локального прокси (для ручной проверки). */ localProxyAddr: () => invoke("local_proxy_addr"), /** Запущено ли приложение с правами администратора. */ isElevated: () => invoke("is_elevated_cmd"), /** Доступен ли awg-shim (AmneziaWG через sing-box: split + статистика). */ awgShimAvailable: () => invoke("awg_shim_available"), /** Перезапустить приложение от имени администратора (UAC). */ relaunchElevated: () => invoke("relaunch_elevated_cmd"), /** Применить настройку «запуск от администратора» (Windows: задача Планировщика). */ applyAdminLaunch: () => invoke("apply_admin_launch"), /** Запускаемые Android-приложения для per-app split picker. */ listInstalledApps: () => invoke("list_installed_apps"), /** Системный запрос Android 13+ на добавление плитки в быстрые настройки. */ requestAndroidQuickTile: () => invoke("request_android_quick_tile"), /** Просит Android-лаунчер закрепить домашний виджет UniGate. */ requestAndroidWidget: () => invoke("request_android_widget"), };