// The ONLY module that touches Tauri. Everything else talks to `backend`. // Inside the Tauri webview this is a thin typed wrapper over invoke/listen // (docs/CONTRACT.md); in a plain browser it is the timer-driven mock. import { invoke } from "@tauri-apps/api/core"; import { listen } from "@tauri-apps/api/event"; import { getCurrentWindow } from "@tauri-apps/api/window"; import { createMockBackend } from "./mock"; import type { Backend, InstallProgress, LogEvent, Market, Settings, SignInResult, StackEvent, Status, SyncConflict, Unlisten, } from "./types"; export const IN_TAURI = typeof window !== "undefined" && "__TAURI_INTERNALS__" in window; function subscribe(event: string, handler: (payload: T) => void): Promise { return listen(event, (e) => handler(e.payload)); } function createTauriBackend(): Backend { const win = getCurrentWindow(); return { kind: "tauri", mock: null, window: { minimize: () => win.minimize(), toggleMaximize: () => win.toggleMaximize(), close: () => win.close(), isMaximized: () => win.isMaximized(), onResized: (handler) => win.onResized(() => handler()), }, getStatus: () => invoke("get_status"), refresh: () => invoke("refresh"), signIn: () => invoke("sign_in"), cancelSignIn: () => invoke("cancel_sign_in"), signOut: () => invoke("sign_out"), getNotes: (version) => invoke("get_notes", version === undefined ? {} : { version }), openExternal: (url) => invoke("open_external", { url }), getStack: () => invoke("get_stack"), startInstall: () => invoke("start_install"), startInstallFromDrive: (path) => invoke("start_install_from_drive", { path }), getMarket: (drive) => invoke("get_market", drive === undefined ? {} : { drive }), applyMarket: (selected) => invoke("apply_market", { selected }), setMarket: (selected, drive) => invoke("set_market", drive === undefined ? { selected } : { selected, drive }), cancelInstall: () => invoke("cancel_install"), launch: () => invoke("launch"), stop: () => invoke("stop"), getSettings: () => invoke("get_settings"), setSettings: (settings) => invoke("set_settings", { settings }), pickFolder: () => invoke("pick_folder"), syncNow: () => invoke("sync_now"), getSyncConflicts: () => invoke("get_sync_conflicts"), resolveSyncConflict: (tbl, key, choice, value) => invoke("resolve_sync_conflict", { tbl, key, choice, value: value === undefined ? null : value }), onStatus: (handler) => subscribe("status", handler), onInstallProgress: (handler) => subscribe("install-progress", handler), onStack: (handler) => subscribe("stack", handler), onLog: (handler) => subscribe("log", handler), }; } export const backend: Backend = IN_TAURI ? createTauriBackend() : createMockBackend(new URLSearchParams(window.location.search));