Files
frost-mqtt-client/app/src/preload/index.js
T

81 lines
3.3 KiB
JavaScript
Raw Normal View History

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
// Custom APIs for renderer
const api = {
2026-07-19 17:15:28 +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),
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) => 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);
},
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);
},
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);
},
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);
},
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
// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
// just add to the DOM global.
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
}