import { app, ipcMain, desktopCapturer } from "electron"; import { spawn } from "child_process"; import log from "electron-log"; import fs from "fs"; import path from "path"; import { promisify } from "util"; import settings from "../settings"; import { sendAdmin } from "../utils/nodemailer"; const rm = promisify(fs.rm); const isWin = process.platform === "win32"; const isDev = process.env.NODE_ENV === "development"; const dbPath = path.normalize(path.join(app.getPath("userData"), "IndexedDB")); let relaunchLock = false; let pruneDBLock = false; const setFloating = (bool) => { const mainWindowSettings = settings.get("mainWindowSettings"); settings.set("mainWindowSettings", { ...mainWindowSettings, isFloating: bool, }); }; const relaunch = () => { app.relaunch(); app.quit(); }; export default function initMainChannel() { ipcMain.handle("main", async (_e, { event, payload }) => { switch (event) { case "delete-db": { const err = await rm(dbPath, { recursive: true, force: true }); if (err) return { result: "error", error: err }; return { result: "success" }; } case "exit-app": app.quit(); break; case "relaunch-app": relaunch(); break; case "switch-to-compact": if (!relaunchLock) { relaunchLock = true; setFloating(true); relaunch(); } break; case "switch-to-normal": if (!relaunchLock) { relaunchLock = true; setFloating(false); relaunch(); } break; case "sendmail-admin": { if (!isDev) sendAdmin({ error: payload, versions: `renderer, ${app.getVersion()}`, }); break; } case "get-screens": { return desktopCapturer.getSources({ types: ["screen"] }); } case "prune-db-and-restart": { if (isWin && !pruneDBLock) { pruneDBLock = true; const exePath = app.getPath("exe"); const exeDir = path.dirname(exePath); const taskillCmd = `taskkill /f /IM ${path.basename(exePath)}`; const pruneDBCmd = `rmdir /s /q ${dbPath}`; const startCmd = `start /D ${exeDir} ${exePath}`; const command = `${taskillCmd} & ${pruneDBCmd} & ${startCmd}`; log.info(`prune-db-and-restart command executed:\n${command}`); spawn(`"cmd.exe" /c ${command}`, { shell: true, detached: true, stdio: "ignore", }); pruneDBLock = false; } break; } default: break; } return null; }); }