import { contextBridge, ipcRenderer } from 'electron'; import { electronAPI } from '@electron-toolkit/preload'; /** * 渲染进程可调用的自定义 API * 封装了所有与主进程通信的 IPC 调用及事件监听 */ const api = { // 服务器管理 getServers: () => ipcRenderer.invoke('mqtt:get-servers'), addServer: (config) => ipcRenderer.invoke('mqtt:add-server', config), updateServer: (id, config) => ipcRenderer.invoke('mqtt:update-server', id, config), deleteServer: (id) => ipcRenderer.invoke('mqtt:delete-server', id), exportServers: () => ipcRenderer.invoke('mqtt:export-servers'), importServers: (serverList) => ipcRenderer.invoke('mqtt:import-servers', serverList), // 连接管理 connect: (id) => ipcRenderer.invoke('mqtt:connect', id), disconnect: (id) => ipcRenderer.invoke('mqtt:disconnect', id), // 主题管理 addTopic: (serverId, topic, qos, comment) => ipcRenderer.invoke('mqtt:add-topic', serverId, topic, qos, comment), removeTopic: (serverId, topic) => ipcRenderer.invoke('mqtt:remove-topic', serverId, topic), subscribe: (serverId, topic) => ipcRenderer.invoke('mqtt:subscribe', serverId, topic), unsubscribe: (serverId, topic) => ipcRenderer.invoke('mqtt:unsubscribe', serverId, topic), subscribeAll: (serverId) => ipcRenderer.invoke('mqtt:subscribe-all', serverId), updateTopic: (serverId, topicId, topic, qos, comment) => ipcRenderer.invoke('mqtt:update-topic', serverId, topicId, topic, qos, comment), // 消息发布 publish: (serverId, topic, payload, opts) => ipcRenderer.invoke('mqtt:publish', serverId, topic, payload, opts), // 消息管理 getMessages: (serverId) => ipcRenderer.invoke('mqtt:get-messages', serverId), getPublishHistory: (serverId) => ipcRenderer.invoke('mqtt:get-publish-history', serverId), clearMessages: (serverId) => ipcRenderer.invoke('mqtt:clear-messages', serverId), clearPublishHistory: (serverId) => ipcRenderer.invoke('mqtt:clear-publish-history', serverId), // 事件监听 onStatusChange: (callback) => { const handler = (_, data) => callback(data); ipcRenderer.on('mqtt:status-change', handler); return () => ipcRenderer.removeListener('mqtt:status-change', handler); }, onMessage: (callback) => { const handler = (_, data) => callback(data); ipcRenderer.on('mqtt:message', handler); return () => ipcRenderer.removeListener('mqtt:message', handler); }, onSubscriptionChange: (callback) => { const handler = (_, data) => callback(data); ipcRenderer.on('mqtt:subscription-change', handler); return () => ipcRenderer.removeListener('mqtt:subscription-change', handler); }, onSubscriptionError: (callback) => { const handler = (_, data) => callback(data); ipcRenderer.on('mqtt:subscription-error', handler); return () => ipcRenderer.removeListener('mqtt:subscription-error', handler); }, onPublishError: (callback) => { const handler = (_, data) => callback(data); ipcRenderer.on('mqtt:publish-error', handler); return () => ipcRenderer.removeListener('mqtt:publish-error', handler); }, }; // 根据是否启用上下文隔离,使用 contextBridge 暴露 API 或挂载到 window if (process.contextIsolated) { try { contextBridge.exposeInMainWorld('electron', electronAPI); contextBridge.exposeInMainWorld('api', api); } catch (error) { console.error(error); } } else { window.electron = electronAPI; window.api = api; }