AssetPro/electron/preload.ts

106 lines
2.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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
}
}