- httpapi:新增 POST /api/shutdown(admin 会话或 X-Shutdown-Token 常量时间比对) 与 GET /api/rules/switches(recorder 可读,只回布尔开关);settings/standings 的 重复 DTO 收敛到 internal/dto;standings.showIndividualMedals 贯通到设置读写与前端 - export:抽出 export.Service,新增自动备份定时任务(backup.intervalMinutes/keep), 自动、手动、发布前三类备份共用同一把互斥锁与滚动清理 - realtime:/ws 去掉 InsecureSkipVerify,改用 OriginPatterns(同源与无 Origin 放行, 跨站需命中 server.allowedOrigins) - console:停止服务改走 POST /api/shutdown 优雅关闭(5 秒宽限后回退强杀), 服务管理器新增「已连接的大屏实例」卡片 - deploy:build.bat 改用 for /f 读内部署名——set /p 在 chcp 65001 下返回空, 导致最近这次构建的 exe 里根本没注入署名 - docs:备份策略、关闭超时、Origin 配置的说明与实现对齐
33 lines
1.6 KiB
JavaScript
33 lines
1.6 KiB
JavaScript
'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'),
|
|
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)
|
|
})
|