From dad3d04403f9e96664fc2370a7b8d997c645f81f Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 29 Sep 2023 15:44:21 +0700 Subject: [PATCH] chore: add plugins migration --- electron/main.ts | 187 ++++++++++++++++++++++++------------------ electron/package.json | 1 + 2 files changed, 107 insertions(+), 81 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index 9b9bb17b2..a0bf6ece3 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -8,16 +8,18 @@ import { } from "electron"; import { readdirSync } from "fs"; import { resolve, join, extname } from "path"; -import { unlink, createWriteStream } from "fs"; +import { rmdir, unlink, createWriteStream } from "fs"; import isDev = require("electron-is-dev"); import { init } from "./core/plugin-manager/pluginMgr"; const { autoUpdater } = require("electron-updater"); +const Store = require("electron-store"); // @ts-ignore import request = require("request"); // @ts-ignore import progress = require("request-progress"); let mainWindow: BrowserWindow | undefined = undefined; +const store = new Store(); autoUpdater.autoDownload = false; autoUpdater.autoInstallOnAppQuit = true; @@ -68,89 +70,112 @@ const createMainWindow = () => { if (isDev) mainWindow.webContents.openDevTools(); }; +const migratePlugins = () => { + return new Promise((resolve) => { + if (store.get("migrated_version") !== app.getVersion()) { + console.log("start migration:", store.get("migrated_version")); + const userDataPath = app.getPath("userData"); + const fullPath = join(userDataPath, "plugins"); -app.whenReady().then(() => { - createMainWindow(); - setupPlugins(); - autoUpdater.checkForUpdates(); - - ipcMain.handle("basePlugins", async (event) => { - const basePluginPath = join( - __dirname, - "../", - isDev ? "/core/pre-install" : "../app.asar.unpacked/core/pre-install" - ); - return readdirSync(basePluginPath) - .filter((file) => extname(file) === ".tgz") - .map((file) => join(basePluginPath, file)); - }); - - ipcMain.handle("pluginPath", async (event) => { - return join(app.getPath("userData"), "plugins"); - }); - ipcMain.handle("appVersion", async (event) => { - return app.getVersion(); - }); - ipcMain.handle("openExternalUrl", async (event, url) => { - shell.openExternal(url); - }); - - /** - * Used to delete a file from the user data folder - */ - ipcMain.handle("deleteFile", async (_event, filePath) => { - const userDataPath = app.getPath("userData"); - const fullPath = join(userDataPath, filePath); - - let result = "NULL"; - unlink(fullPath, function (err) { - if (err && err.code == "ENOENT") { - result = `File not exist: ${err}`; - } else if (err) { - result = `File delete error: ${err}`; - } else { - result = "File deleted successfully"; - } - console.log(`Delete file ${filePath} from ${fullPath} result: ${result}`); - }); - - return result; - }); - - /** - * Used to download a file from a given url - */ - ipcMain.handle("downloadFile", async (_event, url, fileName) => { - const userDataPath = app.getPath("userData"); - const destination = resolve(userDataPath, fileName); - - progress(request(url), {}) - .on("progress", function (state: any) { - mainWindow?.webContents.send("FILE_DOWNLOAD_UPDATE", { - ...state, - fileName, - }); - }) - .on("error", function (err: Error) { - mainWindow?.webContents.send("FILE_DOWNLOAD_ERROR", { - fileName, - err, - }); - }) - .on("end", function () { - mainWindow?.webContents.send("FILE_DOWNLOAD_COMPLETE", { - fileName, - }); - }) - .pipe(createWriteStream(destination)); - }); - - app.on("activate", () => { - if (!BrowserWindow.getAllWindows().length) { - createMainWindow(); + rmdir(fullPath, { recursive: true }, function (err) { + if (err) console.log(err); + store.set("migrated_version", app.getVersion()); + console.log("migrate plugins done"); + resolve(undefined); + }); + } else { + resolve(undefined); } }); -}); +}; + +app + .whenReady() + .then(migratePlugins) + .then(() => { + createMainWindow(); + setupPlugins(); + autoUpdater.checkForUpdates(); + + ipcMain.handle("basePlugins", async (event) => { + const basePluginPath = join( + __dirname, + "../", + isDev ? "/core/pre-install" : "../app.asar.unpacked/core/pre-install" + ); + return readdirSync(basePluginPath) + .filter((file) => extname(file) === ".tgz") + .map((file) => join(basePluginPath, file)); + }); + + ipcMain.handle("pluginPath", async (event) => { + return join(app.getPath("userData"), "plugins"); + }); + ipcMain.handle("appVersion", async (event) => { + return app.getVersion(); + }); + ipcMain.handle("openExternalUrl", async (event, url) => { + shell.openExternal(url); + }); + + /** + * Used to delete a file from the user data folder + */ + ipcMain.handle("deleteFile", async (_event, filePath) => { + const userDataPath = app.getPath("userData"); + const fullPath = join(userDataPath, filePath); + + let result = "NULL"; + unlink(fullPath, function (err) { + if (err && err.code == "ENOENT") { + result = `File not exist: ${err}`; + } else if (err) { + result = `File delete error: ${err}`; + } else { + result = "File deleted successfully"; + } + console.log( + `Delete file ${filePath} from ${fullPath} result: ${result}` + ); + }); + + return result; + }); + + /** + * Used to download a file from a given url + */ + ipcMain.handle("downloadFile", async (_event, url, fileName) => { + const userDataPath = app.getPath("userData"); + const destination = resolve(userDataPath, fileName); + + progress(request(url), {}) + .on("progress", function (state: any) { + mainWindow?.webContents.send("FILE_DOWNLOAD_UPDATE", { + ...state, + fileName, + }); + }) + .on("error", function (err: Error) { + mainWindow?.webContents.send("FILE_DOWNLOAD_ERROR", { + fileName, + err, + }); + }) + .on("end", function () { + mainWindow?.webContents.send("FILE_DOWNLOAD_COMPLETE", { + fileName, + }); + }) + .pipe(createWriteStream(destination)); + }); + + app.on("activate", () => { + if (!BrowserWindow.getAllWindows().length) { + createMainWindow(); + } + }); + }); /*New Update Available*/ autoUpdater.on("update-available", async (info: any) => { diff --git a/electron/package.json b/electron/package.json index abb8ac016..dfdf70f26 100644 --- a/electron/package.json +++ b/electron/package.json @@ -37,6 +37,7 @@ }, "dependencies": { "electron-is-dev": "^2.0.0", + "electron-store": "^8.1.0", "electron-updater": "^6.1.4", "node-llama-cpp": "^2.4.1", "pluggable-electron": "^0.6.0",