src/lib/types.ts
Rama main · réplica de lectura del repositorio original.
// Зеркало доменных моделей из src-tauri/src/models.rs.
// Держать синхронно с Rust-стороной (camelCase, теговые union'ы).
export interface TlsOpts {
enabled: boolean;
sni?: string;
insecure?: boolean;
alpn?: string[];
fingerprint?: string;
realityPublicKey?: string;
realityShortId?: string;
}
export type Transport =
| { type: "ws"; path?: string; host?: string }
| { type: "grpc"; serviceName?: string };
export type Outbound =
| {
type: "socks";
server: string;
port: number;
username?: string;
password?: string;
}
| {
type: "http";
server: string;
port: number;
username?: string;
password?: string;
tls?: boolean;
}
| {
type: "hysteria2";
server: string;
port: number;
password: string;
sni?: string;
insecure?: boolean;
obfsPassword?: string;
upMbps?: number;
downMbps?: number;
}
| {
type: "shadowsocks";
server: string;
port: number;
method: string;
password: string;
}
| {
type: "trojan";
server: string;
port: number;
password: string;
tls: TlsOpts;
transport?: Transport;
}
| {
type: "vless";
server: string;
port: number;
uuid: string;
flow?: string;
tls: TlsOpts;
transport?: Transport;
}
| {
type: "vmess";
server: string;
port: number;
uuid: string;
alterId: number;
security?: string;
tls: TlsOpts;
transport?: Transport;
}
| {
type: "tuic";
server: string;
port: number;
uuid: string;
password: string;
congestionControl?: string;
tls: TlsOpts;
}
| {
// AmneziaWG — отдельный движок; config = готовый .conf
type: "amnezia_wg";
config: string;
server: string;
port: number;
};
export interface Profile {
id: string;
name: string;
outbound: Outbound;
/** Id подписки, если профиль из неё. */
subscriptionId?: string;
}
export interface Subscription {
id: string;
name: string;
url: string;
/** Число профилей из подписки. */
count: number;
/** UNIX-время последнего обновления (сек). */
updatedAt?: number;
}
export type ConnectionState =
| { state: "disconnected" }
| { state: "connecting" }
| { state: "connected" }
| { state: "disconnecting" }
| { state: "error"; message: string };
export interface Traffic {
/** Скорость отдачи, байт/с. */
up: number;
/** Скорость загрузки, байт/с. */
down: number;
/** Суммарно отдано за сессию, байт. */
upTotal: number;
/** Суммарно загружено за сессию, байт. */
downTotal: number;
}
export type Theme = "system" | "light" | "dark";
export type Mode = "proxy" | "tun";
export type TunStack = "gvisor" | "system" | "mixed";
export type AppMode = "off" | "only" | "except";
export interface Routing {
/** LAN (приватные IP) — напрямую. */
bypassLan: boolean;
/** Windows: сохранить конкретные маршруты и DNS одновременно активного OpenVPN/другого VPN. */
vpnCompatibility: boolean;
/** RU-трафик (geoip-ru + .ru/.рф/.su) — напрямую. */
bypassRu: boolean;
/** Режим split по приложениям. */
appMode: AppMode;
/** Приложения через VPN (режим Only). */
onlyApps: string[];
/** Приложения напрямую (режим Except). */
exceptApps: string[];
}
export interface Settings {
theme: Theme;
language: string;
autoConnect: boolean;
activeProfileId: string | null;
mode: Mode;
/** Сетевой стек TUN (gvisor по умолчанию). */
tunStack: TunStack;
routing: Routing;
/** Закрытие окна сворачивает в трей. */
minimizeToTray: boolean;
/** Windows: запуск с правами администратора без UAC (задача Планировщика). */
adminLaunch: boolean;
}
export interface AndroidInstalledApp {
packageName: string;
name: string;
icon: string;
}