'use strict' const { contextBridge, ipcRenderer } = require('electron') // 渲染层是纯静态页面,能力全部经这里白名单暴露,不开 nodeIntegration const subscribe = (channel, callback) => { const handler = (_event, payload) => callback(payload) ipcRenderer.on(channel, handler) return () => ipcRenderer.removeListener(channel, handler) } contextBridge.exposeInMainWorld('consoleApi', { getStatus: () => ipcRenderer.invoke('service:get-status'), startService: () => ipcRenderer.invoke('service:start'), stopService: () => ipcRenderer.invoke('service:stop'), restartService: () => ipcRenderer.invoke('service:restart'), getLog: () => ipcRenderer.invoke('log:tail'), clearLog: () => ipcRenderer.invoke('log:clear'), relayoutDisplays: () => ipcRenderer.invoke('display:relayout'), openExternal: (url) => ipcRenderer.invoke('app:open-external', url), onLog: (callback) => subscribe('log:line', callback), onStatus: (callback) => subscribe('service:status', callback) })