import { ipcRenderer, contextBridge } from 'electron'; import { BIDIRECTIONAL } from '../shared/constants/ipc-channels'; // --------- Expose some API to the Renderer process --------- contextBridge.exposeInMainWorld('ipcRenderer', { on(...args: Parameters) { const [channel, listener] = args; return ipcRenderer.on(channel, (event, ...args) => listener(event, ...args)); }, off(...args: Parameters) { const [channel, ...omit] = args; return ipcRenderer.off(channel, ...omit); }, send(...args: Parameters) { const [channel, ...omit] = args; return ipcRenderer.send(channel, ...omit); }, invoke(...args: Parameters) { const [channel, ...omit] = args; return ipcRenderer.invoke(channel, ...omit); }, }); // --------- 安全加密 API(基于 Electron safeStorage)--------- contextBridge.exposeInMainWorld('safeStorage', { /** * 加密明文字符串 * @param plaintext - 待加密的明文 * @returns Base64 编码的密文,失败返回 null */ async encrypt(plaintext: string): Promise { const result = await ipcRenderer.invoke(BIDIRECTIONAL.SAFESTORAGE_ENCRYPT, plaintext); return result?.success ? result.data : null; }, /** * 解密 Base64 密文 * @param encryptedBase64 - Base64 编码的密文 * @returns 解密后的明文,失败返回 null */ async decrypt(encryptedBase64: string): Promise { const result = await ipcRenderer.invoke(BIDIRECTIONAL.SAFESTORAGE_DECRYPT, encryptedBase64); return result?.success ? result.data : null; }, }); // --------- 本地存储文件 API(主进程 fs 桥接)--------- contextBridge.exposeInMainWorld('fileStorage', { /** 获取 heixiu-data 根目录路径 */ getDataDir(): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.GET_DATA_DIR) .then((r: { success: boolean; data: string }) => r?.success ? r.data : null); }, /** 写入文件(Base64 → 磁盘),返回写入的绝对路径 */ writeFile(relativePath: string, data: string, encoding?: 'base64' | 'utf8'): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.FILE_WRITE, { relativePath, data, encoding }) .then((r: { success: boolean; data: string }) => r?.success ? r.data : null); }, /** 读取文件(磁盘 → Base64) */ readFile(relativePath: string): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.FILE_READ, { relativePath }) .then((r: { success: boolean; data: string }) => r?.success ? r.data : null); }, /** 删除文件 */ deleteFile(relativePath: string): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.FILE_DELETE, { relativePath }) .then((r: { success: boolean }) => r?.success ?? false); }, /** 递归创建目录 */ makeDir(relativePath: string): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.MAKE_DIR, { relativePath }) .then((r: { success: boolean; data: string }) => r?.success ? r.data : null); }, /** 在文件管理器中显示文件(绝对路径) */ showItemInFolder(filePath: string): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.SHOW_ITEM_IN_FOLDER, { filePath }) .then((r: { success: boolean }) => r?.success ?? false); }, /** 获取文件大小(字节) */ fileSize(relativePath: string): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.FILE_SIZE, { relativePath }) .then((r: { success: boolean; data: number }) => r?.success ? r.data : null); }, /** 检查文件/目录是否存在 */ fileExists(relativePath: string): Promise { return ipcRenderer.invoke(BIDIRECTIONAL.FILE_EXISTS, { relativePath }) .then((r: { success: boolean; data: boolean }) => r?.success ? r.data : false); }, });