phper/electron/preload.ts

319 lines
12 KiB
TypeScript

import { contextBridge, ipcRenderer } from "electron";
// 暴露安全的 API 到渲染进程
contextBridge.exposeInMainWorld("electronAPI", {
// 窗口控制
minimize: () => ipcRenderer.invoke("window:minimize"),
maximize: () => ipcRenderer.invoke("window:maximize"),
close: () => ipcRenderer.invoke("window:close"),
// Shell
openExternal: (url: string) => ipcRenderer.invoke("shell:openExternal", url),
openPath: (path: string) => ipcRenderer.invoke("shell:openPath", path),
// Dialog
selectDirectory: () => ipcRenderer.invoke("dialog:selectDirectory"),
// 下载进度监听
onDownloadProgress: (
callback: (data: {
type: string;
progress: number;
downloaded: number;
total: number;
}) => void,
) => {
ipcRenderer.on("download-progress", (_, data) => callback(data));
},
removeDownloadProgressListener: () => {
ipcRenderer.removeAllListeners("download-progress");
},
// PHP 管理
php: {
getVersions: () => ipcRenderer.invoke("php:getVersions"),
getAvailableVersions: () => ipcRenderer.invoke("php:getAvailableVersions"),
install: (version: string) => ipcRenderer.invoke("php:install", version),
uninstall: (version: string) =>
ipcRenderer.invoke("php:uninstall", version),
setActive: (version: string) =>
ipcRenderer.invoke("php:setActive", version),
getExtensions: (version: string) =>
ipcRenderer.invoke("php:getExtensions", version),
openExtensionDir: (version: string) =>
ipcRenderer.invoke("php:openExtensionDir", version),
getAvailableExtensions: (version: string, searchKeyword?: string) =>
ipcRenderer.invoke("php:getAvailableExtensions", version, searchKeyword),
enableExtension: (version: string, ext: string) =>
ipcRenderer.invoke("php:enableExtension", version, ext),
disableExtension: (version: string, ext: string) =>
ipcRenderer.invoke("php:disableExtension", version, ext),
installExtension: (
version: string,
ext: string,
downloadUrl?: string,
packageName?: string,
) =>
ipcRenderer.invoke(
"php:installExtension",
version,
ext,
downloadUrl,
packageName,
),
getConfig: (version: string) =>
ipcRenderer.invoke("php:getConfig", version),
saveConfig: (version: string, config: string) =>
ipcRenderer.invoke("php:saveConfig", version, config),
},
// Composer 管理
composer: {
getStatus: () => ipcRenderer.invoke("composer:getStatus"),
install: () => ipcRenderer.invoke("composer:install"),
uninstall: () => ipcRenderer.invoke("composer:uninstall"),
setMirror: (mirror: string) =>
ipcRenderer.invoke("composer:setMirror", mirror),
createLaravelProject: (projectName: string, targetDir: string) =>
ipcRenderer.invoke(
"composer:createLaravelProject",
projectName,
targetDir,
),
},
// MySQL 管理
mysql: {
getVersions: () => ipcRenderer.invoke("mysql:getVersions"),
getAvailableVersions: () =>
ipcRenderer.invoke("mysql:getAvailableVersions"),
install: (version: string) => ipcRenderer.invoke("mysql:install", version),
uninstall: (version: string) =>
ipcRenderer.invoke("mysql:uninstall", version),
start: (version: string) => ipcRenderer.invoke("mysql:start", version),
stop: (version: string) => ipcRenderer.invoke("mysql:stop", version),
restart: (version: string) => ipcRenderer.invoke("mysql:restart", version),
getStatus: (version: string) =>
ipcRenderer.invoke("mysql:getStatus", version),
changePassword: (
version: string,
newPassword: string,
currentPassword?: string,
) =>
ipcRenderer.invoke(
"mysql:changePassword",
version,
newPassword,
currentPassword,
),
getConfig: (version: string) =>
ipcRenderer.invoke("mysql:getConfig", version),
saveConfig: (version: string, config: string) =>
ipcRenderer.invoke("mysql:saveConfig", version, config),
},
// Nginx 管理
nginx: {
getVersions: () => ipcRenderer.invoke("nginx:getVersions"),
getAvailableVersions: () =>
ipcRenderer.invoke("nginx:getAvailableVersions"),
install: (version: string) => ipcRenderer.invoke("nginx:install", version),
uninstall: (version: string) =>
ipcRenderer.invoke("nginx:uninstall", version),
start: () => ipcRenderer.invoke("nginx:start"),
stop: () => ipcRenderer.invoke("nginx:stop"),
restart: () => ipcRenderer.invoke("nginx:restart"),
reload: () => ipcRenderer.invoke("nginx:reload"),
getStatus: () => ipcRenderer.invoke("nginx:getStatus"),
getConfig: () => ipcRenderer.invoke("nginx:getConfig"),
saveConfig: (config: string) =>
ipcRenderer.invoke("nginx:saveConfig", config),
getSites: () => ipcRenderer.invoke("nginx:getSites"),
addSite: (site: any) => ipcRenderer.invoke("nginx:addSite", site),
removeSite: (name: string) => ipcRenderer.invoke("nginx:removeSite", name),
updateSite: (originalName: string, site: any) =>
ipcRenderer.invoke("nginx:updateSite", originalName, site),
enableSite: (name: string) => ipcRenderer.invoke("nginx:enableSite", name),
disableSite: (name: string) =>
ipcRenderer.invoke("nginx:disableSite", name),
generateLaravelConfig: (site: any) =>
ipcRenderer.invoke("nginx:generateLaravelConfig", site),
requestSSL: (domain: string, email: string) =>
ipcRenderer.invoke("nginx:requestSSL", domain, email),
},
// Redis 管理
redis: {
getVersions: () => ipcRenderer.invoke("redis:getVersions"),
getAvailableVersions: () =>
ipcRenderer.invoke("redis:getAvailableVersions"),
install: (version: string) => ipcRenderer.invoke("redis:install", version),
uninstall: (version: string) =>
ipcRenderer.invoke("redis:uninstall", version),
start: () => ipcRenderer.invoke("redis:start"),
stop: () => ipcRenderer.invoke("redis:stop"),
restart: () => ipcRenderer.invoke("redis:restart"),
getStatus: () => ipcRenderer.invoke("redis:getStatus"),
getConfig: () => ipcRenderer.invoke("redis:getConfig"),
saveConfig: (config: string) =>
ipcRenderer.invoke("redis:saveConfig", config),
},
// Go 管理
go: {
getVersions: () => ipcRenderer.invoke("go:getVersions"),
getAvailableVersions: () => ipcRenderer.invoke("go:getAvailableVersions"),
install: (version: string, downloadUrl: string) =>
ipcRenderer.invoke("go:install", version, downloadUrl),
uninstall: (version: string) => ipcRenderer.invoke("go:uninstall", version),
setActive: (version: string) => ipcRenderer.invoke("go:setActive", version),
getInfo: (version: string) => ipcRenderer.invoke("go:getInfo", version),
},
// Node.js 管理
node: {
getVersions: () => ipcRenderer.invoke("node:getVersions"),
getAvailableVersions: () => ipcRenderer.invoke("node:getAvailableVersions"),
install: (version: string, downloadUrl: string) =>
ipcRenderer.invoke("node:install", version, downloadUrl),
uninstall: (version: string) =>
ipcRenderer.invoke("node:uninstall", version),
setActive: (version: string) =>
ipcRenderer.invoke("node:setActive", version),
getInfo: (version: string) => ipcRenderer.invoke("node:getInfo", version),
},
// Git 管理
git: {
getVersions: () => ipcRenderer.invoke("git:getVersions"),
getAvailableVersions: () => ipcRenderer.invoke("git:getAvailableVersions"),
install: (version: string) => ipcRenderer.invoke("git:install", version),
uninstall: () => ipcRenderer.invoke("git:uninstall"),
checkSystem: () => ipcRenderer.invoke("git:checkSystem"),
getConfig: () => ipcRenderer.invoke("git:getConfig"),
setConfig: (name: string, email: string) =>
ipcRenderer.invoke("git:setConfig", name, email),
},
// Python 管理
python: {
getVersions: () => ipcRenderer.invoke("python:getVersions"),
getAvailableVersions: () =>
ipcRenderer.invoke("python:getAvailableVersions"),
install: (version: string) => ipcRenderer.invoke("python:install", version),
uninstall: (version: string) =>
ipcRenderer.invoke("python:uninstall", version),
setActive: (version: string) =>
ipcRenderer.invoke("python:setActive", version),
checkSystem: () => ipcRenderer.invoke("python:checkSystem"),
getPipInfo: (version: string) =>
ipcRenderer.invoke("python:getPipInfo", version),
installPackage: (version: string, packageName: string) =>
ipcRenderer.invoke("python:installPackage", version, packageName),
},
// 服务管理
service: {
getAll: () => ipcRenderer.invoke("service:getAll"),
setAutoStart: (service: string, enabled: boolean) =>
ipcRenderer.invoke("service:setAutoStart", service, enabled),
getAutoStart: (service: string) =>
ipcRenderer.invoke("service:getAutoStart", service),
startAll: () => ipcRenderer.invoke("service:startAll"),
stopAll: () => ipcRenderer.invoke("service:stopAll"),
// PHP-CGI 多版本管理
getPhpCgiStatus: () => ipcRenderer.invoke("service:getPhpCgiStatus"),
startPhpCgi: () => ipcRenderer.invoke("service:startPhpCgi"),
stopPhpCgi: () => ipcRenderer.invoke("service:stopPhpCgi"),
startAllPhpCgi: () => ipcRenderer.invoke("service:startAllPhpCgi"),
stopAllPhpCgi: () => ipcRenderer.invoke("service:stopAllPhpCgi"),
startPhpCgiVersion: (version: string) =>
ipcRenderer.invoke("service:startPhpCgiVersion", version),
stopPhpCgiVersion: (version: string) =>
ipcRenderer.invoke("service:stopPhpCgiVersion", version),
getPhpCgiPort: (version: string) =>
ipcRenderer.invoke("service:getPhpCgiPort", version),
},
// Hosts 管理
hosts: {
get: () => ipcRenderer.invoke("hosts:get"),
add: (domain: string, ip: string) =>
ipcRenderer.invoke("hosts:add", domain, ip),
remove: (domain: string) => ipcRenderer.invoke("hosts:remove", domain),
},
// 配置管理
config: {
get: (key: string) => ipcRenderer.invoke("config:get", key),
set: (key: string, value: any) =>
ipcRenderer.invoke("config:set", key, value),
getBasePath: () => ipcRenderer.invoke("config:getBasePath"),
setBasePath: (path: string) =>
ipcRenderer.invoke("config:setBasePath", path),
},
// 日志管理
log: {
getFiles: () => ipcRenderer.invoke("log:getFiles"),
read: (logPath: string, lines?: number) =>
ipcRenderer.invoke("log:read", logPath, lines),
clear: (logPath: string) => ipcRenderer.invoke("log:clear", logPath),
getDirectory: (
type: "nginx" | "php" | "mysql" | "sites",
version?: string,
) => ipcRenderer.invoke("log:getDirectory", type, version),
},
// 应用设置
app: {
setAutoLaunch: (enabled: boolean) =>
ipcRenderer.invoke("app:setAutoLaunch", enabled),
getAutoLaunch: () => ipcRenderer.invoke("app:getAutoLaunch"),
setStartMinimized: (enabled: boolean) =>
ipcRenderer.invoke("app:setStartMinimized", enabled),
getStartMinimized: () => ipcRenderer.invoke("app:getStartMinimized"),
getVersion: () =>
ipcRenderer.invoke("app:getVersion") as Promise<{
version: string;
buildTime: string;
buildDate: string;
isPackaged: boolean;
}>,
setAutoStartServices: (enabled: boolean) =>
ipcRenderer.invoke("app:setAutoStartServices", enabled),
getAutoStartServices: () => ipcRenderer.invoke("app:getAutoStartServices"),
quit: () => ipcRenderer.invoke("app:quit"),
},
// 监听服务状态变化
onServiceStatusChanged: (callback: () => void) => {
ipcRenderer.on("service-status-changed", callback);
},
removeServiceStatusChangedListener: (callback: () => void) => {
ipcRenderer.removeListener("service-status-changed", callback);
},
});
// 声明 Window 接口扩展
declare global {
interface Window {
electronAPI: typeof api;
}
}
const api = {
minimize: () => ipcRenderer.invoke("window:minimize"),
maximize: () => ipcRenderer.invoke("window:maximize"),
close: () => ipcRenderer.invoke("window:close"),
openExternal: (url: string) => ipcRenderer.invoke("shell:openExternal", url),
openPath: (path: string) => ipcRenderer.invoke("shell:openPath", path),
php: {} as any,
mysql: {} as any,
nginx: {} as any,
redis: {} as any,
service: {} as any,
hosts: {} as any,
config: {} as any,
};