106 lines
2.8 KiB
TypeScript
106 lines
2.8 KiB
TypeScript
/**
|
||
* Electron Preload 脚本
|
||
*
|
||
* 这是渲染进程和主进程之间的安全桥梁
|
||
* 通过 contextBridge 安全地暴露 API 给渲染进程
|
||
*
|
||
* 安全说明:
|
||
* - contextIsolation: true 确保渲染进程无法直接访问 Node.js API
|
||
* - 所有暴露的方法都经过 IPC 通道与主进程通信
|
||
* - 不要在这里导入 electron-store 或其他 Node.js 模块
|
||
*/
|
||
import { contextBridge, ipcRenderer } from 'electron'
|
||
|
||
// IPC 通道名称(与 ipc.ts 保持一致)
|
||
const IPC_CHANNELS = {
|
||
SAVE_FILE: 'file:save',
|
||
READ_FILE: 'file:read',
|
||
GET_SETTINGS: 'settings:get',
|
||
SAVE_SETTINGS: 'settings:save'
|
||
} as const
|
||
|
||
// API 响应类型定义
|
||
interface FileOperationResult {
|
||
success: boolean
|
||
message: string
|
||
path?: string | null
|
||
content?: string | null
|
||
}
|
||
|
||
interface SettingsOperationResult {
|
||
success: boolean
|
||
message?: string
|
||
data?: unknown
|
||
}
|
||
|
||
// 暴露给渲染进程的 API 接口
|
||
interface ElectronAPI {
|
||
// 文件操作
|
||
file: {
|
||
save: (content: string, filename?: string) => Promise<FileOperationResult>
|
||
read: (filename?: string) => Promise<FileOperationResult>
|
||
}
|
||
// 设置操作
|
||
settings: {
|
||
get: (key?: string) => Promise<SettingsOperationResult>
|
||
save: (key: string, value: unknown) => Promise<SettingsOperationResult>
|
||
}
|
||
}
|
||
|
||
// 通过 contextBridge 安全地暴露 API
|
||
const electronAPI: ElectronAPI = {
|
||
// ============================================
|
||
// 文件操作 API
|
||
// ============================================
|
||
file: {
|
||
/**
|
||
* 保存文件到桌面
|
||
* @param content - 文件内容
|
||
* @param filename - 文件名(可选,默认为 demo-note.txt)
|
||
*/
|
||
save: (content: string, filename?: string) => {
|
||
return ipcRenderer.invoke(IPC_CHANNELS.SAVE_FILE, content, filename)
|
||
},
|
||
|
||
/**
|
||
* 从桌面读取文件
|
||
* @param filename - 文件名(可选,默认为 demo-note.txt)
|
||
*/
|
||
read: (filename?: string) => {
|
||
return ipcRenderer.invoke(IPC_CHANNELS.READ_FILE, filename)
|
||
}
|
||
},
|
||
|
||
// ============================================
|
||
// 设置操作 API
|
||
// ============================================
|
||
settings: {
|
||
/**
|
||
* 获取用户设置
|
||
* @param key - 设置键名(可选,不传返回所有设置)
|
||
*/
|
||
get: (key?: string) => {
|
||
return ipcRenderer.invoke(IPC_CHANNELS.GET_SETTINGS, key)
|
||
},
|
||
|
||
/**
|
||
* 保存用户设置
|
||
* @param key - 设置键名
|
||
* @param value - 设置值
|
||
*/
|
||
save: (key: string, value: unknown) => {
|
||
return ipcRenderer.invoke(IPC_CHANNELS.SAVE_SETTINGS, key, value)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 暴露 API 到 window.electronAPI
|
||
contextBridge.exposeInMainWorld('electronAPI', electronAPI)
|
||
|
||
// TypeScript 类型声明(供渲染进程使用)
|
||
declare global {
|
||
interface Window {
|
||
electronAPI: ElectronAPI
|
||
}
|
||
}
|