'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'), getDisplayInstances: () => ipcRenderer.invoke('display:instances-get'), setOpenAtLogin: (enabled) => ipcRenderer.invoke('startup:set-open-at-login', enabled), openServerAdmin: () => ipcRenderer.invoke('app:open-server-admin'), resetAdminAccount: (payload) => ipcRenderer.invoke('account:reset', payload), minimize: () => ipcRenderer.invoke('window:minimize'), maximize: () => ipcRenderer.invoke('window:maximize'), close: () => ipcRenderer.invoke('window:close'), isMaximized: () => ipcRenderer.invoke('window:is-maximized'), onMaximizeChange: (callback) => subscribe('window:maximize-changed', callback), onAccountOutput: (callback) => subscribe('account:output', callback), onDisplayInstances: (callback) => subscribe('display:instances', callback), onLog: (callback) => subscribe('log:line', callback), onStatus: (callback) => subscribe('service:status', callback) })