2026-07-19 17:15:28 +08:00
|
|
|
import { contextBridge, ipcRenderer } from 'electron';
|
|
|
|
|
import { electronAPI } from '@electron-toolkit/preload';
|
2026-07-15 21:06:19 +08:00
|
|
|
|
2026-07-19 23:08:58 +08:00
|
|
|
/**
|
|
|
|
|
* 渲染进程可调用的自定义 API
|
|
|
|
|
* 封装了所有与主进程通信的 IPC 调用及事件监听
|
|
|
|
|
*/
|
2026-07-18 19:23:50 +08:00
|
|
|
const api = {
|
2026-07-19 17:15:28 +08:00
|
|
|
|
2026-07-18 19:23:50 +08:00
|
|
|
// 服务器管理
|
|
|
|
|
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),
|
2026-07-19 20:00:33 +08:00
|
|
|
exportServers: () => ipcRenderer.invoke('mqtt:export-servers'),
|
|
|
|
|
importServers: (serverList) => ipcRenderer.invoke('mqtt:import-servers', serverList),
|
2026-07-18 19:23:50 +08:00
|
|
|
|
|
|
|
|
// 连接管理
|
|
|
|
|
connect: (id) => ipcRenderer.invoke('mqtt:connect', id),
|
|
|
|
|
disconnect: (id) => ipcRenderer.invoke('mqtt:disconnect', id),
|
|
|
|
|
|
|
|
|
|
// 主题管理
|
|
|
|
|
addTopic: (serverId, topic, qos) => ipcRenderer.invoke('mqtt:add-topic', serverId, topic, qos),
|
|
|
|
|
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) =>
|
|
|
|
|
ipcRenderer.invoke('mqtt:update-topic', serverId, topicId, topic, qos),
|
|
|
|
|
|
|
|
|
|
// 消息发布
|
|
|
|
|
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) => {
|
2026-07-19 17:15:28 +08:00
|
|
|
const handler = (_, data) => callback(data);
|
|
|
|
|
ipcRenderer.on('mqtt:status-change', handler);
|
|
|
|
|
return () => ipcRenderer.removeListener('mqtt:status-change', handler);
|
2026-07-18 19:23:50 +08:00
|
|
|
},
|
|
|
|
|
onMessage: (callback) => {
|
2026-07-19 17:15:28 +08:00
|
|
|
const handler = (_, data) => callback(data);
|
|
|
|
|
ipcRenderer.on('mqtt:message', handler);
|
|
|
|
|
return () => ipcRenderer.removeListener('mqtt:message', handler);
|
2026-07-18 19:23:50 +08:00
|
|
|
},
|
|
|
|
|
onSubscriptionChange: (callback) => {
|
2026-07-19 17:15:28 +08:00
|
|
|
const handler = (_, data) => callback(data);
|
|
|
|
|
ipcRenderer.on('mqtt:subscription-change', handler);
|
|
|
|
|
return () => ipcRenderer.removeListener('mqtt:subscription-change', handler);
|
2026-07-18 19:23:50 +08:00
|
|
|
},
|
|
|
|
|
onSubscriptionError: (callback) => {
|
2026-07-19 17:15:28 +08:00
|
|
|
const handler = (_, data) => callback(data);
|
|
|
|
|
ipcRenderer.on('mqtt:subscription-error', handler);
|
|
|
|
|
return () => ipcRenderer.removeListener('mqtt:subscription-error', handler);
|
2026-07-18 19:23:50 +08:00
|
|
|
},
|
|
|
|
|
onPublishError: (callback) => {
|
2026-07-19 17:15:28 +08:00
|
|
|
const handler = (_, data) => callback(data);
|
|
|
|
|
ipcRenderer.on('mqtt:publish-error', handler);
|
|
|
|
|
return () => ipcRenderer.removeListener('mqtt:publish-error', handler);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
};
|
2026-07-15 21:06:19 +08:00
|
|
|
|
2026-07-19 23:08:58 +08:00
|
|
|
// 根据是否启用上下文隔离,使用 contextBridge 暴露 API 或挂载到 window
|
2026-07-15 21:06:19 +08:00
|
|
|
if (process.contextIsolated) {
|
|
|
|
|
try {
|
2026-07-19 17:15:28 +08:00
|
|
|
contextBridge.exposeInMainWorld('electron', electronAPI);
|
|
|
|
|
contextBridge.exposeInMainWorld('api', api);
|
2026-07-15 21:06:19 +08:00
|
|
|
} catch (error) {
|
2026-07-19 17:15:28 +08:00
|
|
|
console.error(error);
|
2026-07-15 21:06:19 +08:00
|
|
|
}
|
|
|
|
|
} else {
|
2026-07-19 17:15:28 +08:00
|
|
|
window.electron = electronAPI;
|
|
|
|
|
window.api = api;
|
2026-07-15 21:06:19 +08:00
|
|
|
}
|