From 26e48f07fda3f943f13440326232c32c0dbe357b Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Sat, 12 Oct 2024 10:09:52 +0800 Subject: [PATCH] fix: old version of the backup file cannot be restored. --- src/main/ipc.ts | 3 +++ src/main/utils/zip.ts | 39 +++++++++++++++++++++++++++++++++++++++ src/preload/index.ts | 2 ++ 3 files changed, 44 insertions(+) create mode 100644 src/main/utils/zip.ts diff --git a/src/main/ipc.ts b/src/main/ipc.ts index c75f41aa..4e3a32e2 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -4,6 +4,7 @@ import { appConfig, titleBarOverlayDark, titleBarOverlayLight } from './config' import AppUpdater from './services/AppUpdater' import BackupManager from './services/BackupManager' import FileManager from './services/FileManager' +import { compress, decompress } from './utils/zip' import { createMinappWindow } from './window' const fileManager = new FileManager() @@ -29,6 +30,8 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { ipcMain.handle('reload', () => mainWindow.reload()) + ipcMain.handle('zip:compress', (_, text: string) => compress(text)) + ipcMain.handle('zip:decompress', (_, text: Buffer) => decompress(text)) ipcMain.handle('backup:backup', backupManager.backup) ipcMain.handle('backup:restore', backupManager.restore) ipcMain.handle('backup:backupToWebdav', backupManager.backupToWebdav) diff --git a/src/main/utils/zip.ts b/src/main/utils/zip.ts new file mode 100644 index 00000000..7b456973 --- /dev/null +++ b/src/main/utils/zip.ts @@ -0,0 +1,39 @@ +import util from 'node:util' +import zlib from 'node:zlib' + +import logger from 'electron-log' + +// 将 zlib 的 gzip 和 gunzip 方法转换为 Promise 版本 +const gzipPromise = util.promisify(zlib.gzip) +const gunzipPromise = util.promisify(zlib.gunzip) + +/** + * 压缩字符串 + * @param {string} string - 要压缩的 JSON 字符串 + * @returns {Promise} 压缩后的 Buffer + */ +export async function compress(str) { + try { + const buffer = Buffer.from(str, 'utf-8') + const compressedBuffer = await gzipPromise(buffer) + return compressedBuffer + } catch (error) { + logger.error('Compression failed:', error) + throw error + } +} + +/** + * 解压缩 Buffer 到 JSON 字符串 + * @param {Buffer} compressedBuffer - 压缩的 Buffer + * @returns {Promise} 解压缩后的 JSON 字符串 + */ +export async function decompress(compressedBuffer) { + try { + const buffer = await gunzipPromise(compressedBuffer) + return buffer.toString('utf-8') + } catch (error) { + logger.error('Decompression failed:', error) + throw error + } +} diff --git a/src/preload/index.ts b/src/preload/index.ts index 51288d97..8a3b3d97 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -11,6 +11,8 @@ const api = { setTheme: (theme: 'light' | 'dark') => ipcRenderer.invoke('set-theme', theme), minApp: (url: string) => ipcRenderer.invoke('minapp', url), reload: () => ipcRenderer.invoke('reload'), + compress: (text: string) => ipcRenderer.invoke('zip:compress', text), + decompress: (text: Buffer) => ipcRenderer.invoke('zip:decompress', text), backup: { backup: (fileName: string, data: string, destinationPath?: string) => ipcRenderer.invoke('backup:backup', fileName, data, destinationPath),