// ============================================================ // IPC 安全访问守卫 // window.ipcRenderer 仅在 Electron 环境中存在(由 preload 注入), // 浏览器环境下为 undefined,所有调用必须先行判断。 // ============================================================ /** 检查是否在 Electron 环境中(window.ipcRenderer 可用) */ export function hasIpc(): boolean { return typeof window !== 'undefined' && window.ipcRenderer != null; } /** 安全地监听 IPC 消息 */ export function safeIpcOn( channel: string, listener: (event: unknown, ...args: unknown[]) => void, ): void { if (hasIpc()) { window.ipcRenderer.on(channel, listener); } } /** 安全地取消监听 IPC 消息 */ export function safeIpcOff(channel: string, listener: (...args: unknown[]) => void): void { if (hasIpc()) { window.ipcRenderer.off(channel, listener); } } /** 安全地发送 IPC 消息(不等待响应) */ export function safeIpcSend(channel: string, ...args: unknown[]): void { if (hasIpc()) { window.ipcRenderer.send(channel, ...args); } } /** 安全地调用 IPC(等待响应) */ export async function safeIpcInvoke(channel: string, ...args: unknown[]): Promise { if (!hasIpc()) { console.warn(`[IPC] 非 Electron 环境,invoke "${channel}" 被忽略`); return undefined; } return window.ipcRenderer.invoke(channel, ...args); }