import { IPC_EVENTS, WINDOW_NAMES } from './constants'; import { invokeIpc } from './host-api'; import type { RuntimePlatform, WindowIdentity, WindowName } from '../types/runtime'; function normalizePlatform(platform: string | undefined | null): RuntimePlatform { const value = platform?.toLowerCase() ?? ''; if (value === 'win32' || value.includes('win')) return 'win32'; if (value === 'darwin' || value.includes('mac')) return 'darwin'; if (value === 'linux') return 'linux'; if (value) return 'unknown'; return 'web'; } export function hasIpcBridge(): boolean { return typeof window !== 'undefined' && Boolean(window.api?.invoke); } export function detectRuntimePlatform(): RuntimePlatform { if (typeof window === 'undefined') return 'unknown'; const exposedPlatform = window.api?.platform; if (exposedPlatform) return normalizePlatform(exposedPlatform); if (typeof navigator !== 'undefined') { const nav = navigator as Navigator & { userAgentData?: { platform?: string } }; return normalizePlatform(nav.platform || nav.userAgentData?.platform); } return window.api ? 'unknown' : 'web'; } function readWindowIdFromBridge(): string | number | null { if (typeof window.api?.getCurrentWindowId === 'function') { return window.api.getCurrentWindowId(); } return null; } export function detectWindowName(windowId?: string | number | null): WindowName { if (typeof windowId === 'string') { const normalized = windowId.toLowerCase(); if (normalized.includes('setting')) return WINDOW_NAMES.SETTING; if (normalized.includes('dialog')) return WINDOW_NAMES.DIALOG; if (normalized.includes('loading')) return WINDOW_NAMES.LOADING; } return WINDOW_NAMES.MAIN; } export async function resolveWindowIdentity(): Promise { const platform = detectRuntimePlatform(); const isElectron = platform !== 'web' && platform !== 'unknown'; if (!hasIpcBridge()) { return { platform, windowId: null, windowName: WINDOW_NAMES.MAIN, isElectron, }; } let windowId: string | number | null = null; try { windowId = readWindowIdFromBridge(); if (windowId === null) { windowId = await invokeIpc(IPC_EVENTS.GET_WINDOW_ID); } } catch { windowId = null; } return { platform, windowId, windowName: detectWindowName(windowId), isElectron, }; }