import { readFile, rm } from 'node:fs/promises' import type { ZapretDiagnosticResult, ZapretList, ZapretListId, ZapretLogLine, ZapretStatus, ZapretStrategy } from '../../shared/ipc-contract' import { runDiagnostics } from './diagnostics' import { DarwinEngine } from './engine.darwin' import { ZapretEngine, UnsupportedEngine } from './engine' import { Win32Engine } from './engine.win32' import { readAllLists, resetList, seedLists, writeList } from './lists' import { autoHostlistPath } from './paths' import { listStrategies } from './strategies' function createEngine(): ZapretEngine { switch (process.platform) { case 'darwin': return new DarwinEngine() case 'win32': return new Win32Engine() default: return new UnsupportedEngine() } } const engine = createEngine() /** * Готовим списки сайтов и синхронизируем состояние с системой — на macOS чиним прокси * от прошлого аварийного завершения, на Windows подхватываем службу, которая могла работать * ещё до открытия окна (автозапуск с системой). Оба шага нужно сделать до открытия окна. */ export async function recoverZapret(): Promise { await seedLists() if (engine instanceof DarwinEngine) await engine.recoverFromCrash() if (engine instanceof Win32Engine) await engine.sync() } export function zapretStatus(): ZapretStatus { return engine.getStatus() } export function zapretStrategies(): ZapretStrategy[] { return listStrategies(process.platform) } export function zapretLog(): ZapretLogLine[] { return engine.getLog() } export function startZapret(strategyId: string): Promise { return engine.start(strategyId) } export function stopZapret(): Promise { return engine.stop() } export function setZapretSystemProxy(enabled: boolean): Promise { return engine.setSystemProxy(enabled) } export function setZapretStrategy(strategyId: string): Promise { return engine.setStrategy(strategyId) } export function setZapretAutoStart(enabled: boolean): Promise { return engine.setAutoStart(enabled) } /** Вызывать при выходе из приложения — гасит процесс и откатывает системные настройки. */ export function disposeZapret(): Promise { return engine.dispose() } export function zapretLists(): Promise { return readAllLists() } export function saveZapretList(id: ZapretListId, entries: string[]): Promise { return writeList(id, entries) } export function resetZapretList(id: ZapretListId): Promise { return resetList(id) } /** Домены, которые zapret нашёл сам через `--hostlist-auto` (только macOS-профили). */ export async function zapretAutoHostlist(): Promise { try { const content = await readFile(autoHostlistPath(), 'utf8') return content .split('\n') .map((line) => line.trim()) .filter(Boolean) } catch { return [] } } export async function clearZapretAutoHostlist(): Promise { await rm(autoHostlistPath(), { force: true }) } export function zapretDiagnostics(): Promise { return runDiagnostics(engine.getStatus()) }