diff --git a/packages/web/src/lib/discovery.ts b/packages/web/src/lib/discovery.ts index 83bc365..7d983c4 100644 --- a/packages/web/src/lib/discovery.ts +++ b/packages/web/src/lib/discovery.ts @@ -1,14 +1,13 @@ import { httpFetch } from "@/lib/http"; +import { isTauri } from "@/lib/platform"; + +export { isTauri } from "@/lib/platform"; export interface DiscoveredInstance { port: number; base_url: string; } -export function isTauri(): boolean { - return typeof window !== "undefined" && "__TAURI_INTERNALS__" in window; -} - /** * Probe localhost ports for running Honcho instances. Desktop-only — the web * build can't port-scan due to CORS, so this returns an empty list when not diff --git a/packages/web/src/lib/http.ts b/packages/web/src/lib/http.ts index 96c325a..41ba6b8 100644 --- a/packages/web/src/lib/http.ts +++ b/packages/web/src/lib/http.ts @@ -1,12 +1,8 @@ import { fetch as tauriFetch } from "@tauri-apps/plugin-http"; +import { isTauri } from "@/lib/platform"; // Route fetch through Rust (reqwest) when running in Tauri — bypasses WebView CORS enforcement. -// Falls back to native browser fetch during plain web dev (`pnpm dev:web`). -const isTauri = Boolean( - typeof window !== "undefined" && - (window as unknown as Record).__TAURI_INTERNALS__, -); - -export const httpFetch: typeof globalThis.fetch = isTauri +// Falls back to native browser fetch during plain web dev. +export const httpFetch: typeof globalThis.fetch = isTauri() ? (tauriFetch as typeof globalThis.fetch) : globalThis.fetch; diff --git a/packages/web/src/lib/platform.ts b/packages/web/src/lib/platform.ts new file mode 100644 index 0000000..6755142 --- /dev/null +++ b/packages/web/src/lib/platform.ts @@ -0,0 +1,4 @@ +/** True when running inside the Tauri desktop shell (WebView with injected internals). */ +export function isTauri(): boolean { + return typeof window !== "undefined" && "__TAURI_INTERNALS__" in window; +} diff --git a/packages/web/src/test/platform.test.ts b/packages/web/src/test/platform.test.ts new file mode 100644 index 0000000..5be6805 --- /dev/null +++ b/packages/web/src/test/platform.test.ts @@ -0,0 +1,17 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { isTauri } from "@/lib/platform"; + +describe("isTauri", () => { + afterEach(() => { + delete (window as unknown as Record).__TAURI_INTERNALS__; + }); + + it("returns false in a plain browser/jsdom environment", () => { + expect(isTauri()).toBe(false); + }); + + it("returns true when the Tauri internals global is present", () => { + (window as unknown as Record).__TAURI_INTERNALS__ = {}; + expect(isTauri()).toBe(true); + }); +});