import type { HttpResult, HttpSpec, Transport, WsSession, WsSpec } from "@opsxapi/core"; async function invoke(cmd: string, args?: Record): Promise { try { const { invoke: tauriInvoke } = await import("@tauri-apps/api/core"); return await tauriInvoke(cmd, args); } catch (e) { const msg = e instanceof Error ? e.message : String(e); throw new Error( `tauri-native invoke("${cmd}") failed (are you running inside OpsxAPI desktop?): ${msg}`, ); } } export const tauriNativeTransport: Transport = { async http(spec: HttpSpec): Promise { return invoke("http_send", { spec }); }, ws(spec: WsSpec): WsSession { const messageCbs: Array<(data: string) => void> = []; const statusCbs: Array<(s: string) => void> = []; let sessionId: string | null = null; const emitStatus = (s: string) => statusCbs.forEach((cb) => cb(s)); void (async () => { try { emitStatus("connecting"); sessionId = await invoke("ws_connect", { spec }); emitStatus("open"); // Full event listen pipeline is Week 2; stub keeps UI usable. } catch (e) { emitStatus("error"); messageCbs.forEach((cb) => cb(`[ws_connect error] ${e instanceof Error ? e.message : String(e)}`), ); } })(); return { onMessage(cb) { messageCbs.push(cb); }, onStatus(cb) { statusCbs.push(cb); }, send(data) { if (!sessionId) { messageCbs.forEach((cb) => cb("[ws] not connected")); return; } void invoke("ws_send", { sessionId, data }).catch((e) => { messageCbs.forEach((cb) => cb(`[ws_send error] ${e instanceof Error ? e.message : String(e)}`), ); }); }, close() { if (!sessionId) return; void invoke("ws_close", { sessionId }).finally(() => { sessionId = null; emitStatus("closed"); }); }, }; }, };