diff --git a/scripts/build/build.mts b/scripts/build/build.mts index 243381b..9a1165d 100644 --- a/scripts/build/build.mts +++ b/scripts/build/build.mts @@ -22,7 +22,7 @@ const NodeCommonOpts: BuildOptions = { ...CommonOpts, format: "cjs", platform: "node", - external: ["electron"], + external: ["electron", "original-fs"], target: ["esnext"], define: { IS_DEV: JSON.stringify(isDev) diff --git a/src/main/constants.ts b/src/main/constants.ts index 81cfd53..b6376fb 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -47,9 +47,10 @@ export const VENCORD_THEMES_DIR = join(DATA_DIR, "themes"); // needs to be inline require because of circular dependency // as otherwise "DATA_DIR" (which is used by ./settings) will be uninitialised -export const VENCORD_FILES_DIR = - (require("./settings") as typeof import("./settings")).State.store.vencordDir || - join(SESSION_DATA_DIR, "vencordFiles"); +export const VENCORD_DIR = (() => { + const { State } = require("./settings") as typeof import("./settings"); + return State.store.vencordDir ? join(State.store.vencordDir, "vesktop") : join(SESSION_DATA_DIR, "vencord.asar"); +})(); export const USER_AGENT = `Vesktop/${app.getVersion()} (https://github.com/Vencord/Vesktop)`; diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 4fa662c..6942723 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -17,7 +17,7 @@ import { debounce } from "shared/utils/debounce"; import { IpcEvents } from "../shared/IpcEvents"; import { setBadgeCount } from "./appBadge"; import { autoStart } from "./autoStart"; -import { VENCORD_FILES_DIR, VENCORD_QUICKCSS_FILE, VENCORD_THEMES_DIR } from "./constants"; +import { VENCORD_DIR, VENCORD_QUICKCSS_FILE, VENCORD_THEMES_DIR } from "./constants"; import { mainWin } from "./mainWindow"; import { Settings, State } from "./settings"; import { handle, handleSync } from "./utils/ipcWrappers"; @@ -25,10 +25,8 @@ import { PopoutWindows } from "./utils/popout"; import { isDeckGameMode, showGamePage } from "./utils/steamOS"; import { isValidVencordInstall } from "./utils/vencordLoader"; -handleSync(IpcEvents.GET_VENCORD_PRELOAD_FILE, () => join(VENCORD_FILES_DIR, "vencordDesktopPreload.js")); -handleSync(IpcEvents.GET_VENCORD_RENDERER_SCRIPT, () => - readFileSync(join(VENCORD_FILES_DIR, "vencordDesktopRenderer.js"), "utf-8") -); +handleSync(IpcEvents.GET_VENCORD_PRELOAD_FILE, () => join(VENCORD_DIR, "preload.js")); +handleSync(IpcEvents.GET_VENCORD_RENDERER_SCRIPT, () => readFileSync(join(VENCORD_DIR, "renderer.js"), "utf-8")); handleSync(IpcEvents.GET_RENDERER_SCRIPT, () => readFileSync(join(__dirname, "renderer.js"), "utf-8")); handleSync(IpcEvents.GET_RENDERER_CSS_FILE, () => join(__dirname, "renderer.css")); diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 1292449..1a483a3 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -34,13 +34,13 @@ import { MessageBoxChoice, MIN_HEIGHT, MIN_WIDTH, - VENCORD_FILES_DIR + VENCORD_DIR } from "./constants"; import { Settings, State, VencordSettings } from "./settings"; import { createSplashWindow } from "./splash"; import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally"; import { applyDeckKeyboardFix, askToApplySteamLayout, isDeckGameMode } from "./utils/steamOS"; -import { downloadVencordFiles, ensureVencordFiles } from "./utils/vencordLoader"; +import { downloadVencordAsar, ensureVencordFiles } from "./utils/vencordLoader"; let isQuitting = false; let tray: Tray; @@ -93,7 +93,7 @@ function initTray(win: BrowserWindow) { { label: "Repair Vencord", async click() { - await downloadVencordFiles(); + await downloadVencordAsar(); app.relaunch(); app.quit(); } @@ -167,7 +167,7 @@ function initMenuBar(win: BrowserWindow) { { label: "Force Update Vencord", async click() { - await downloadVencordFiles(); + await downloadVencordAsar(); app.relaunch(); app.quit(); }, @@ -465,7 +465,7 @@ function createMainWindow() { return win; } -const runVencordMain = once(() => require(join(VENCORD_FILES_DIR, "vencordDesktopMain.js"))); +const runVencordMain = once(() => require(VENCORD_DIR)); export async function createWindows() { const startMinimized = process.argv.includes("--start-minimized"); diff --git a/src/main/utils/http.ts b/src/main/utils/http.ts index baee81e..5ec05fa 100644 --- a/src/main/utils/http.ts +++ b/src/main/utils/http.ts @@ -4,7 +4,7 @@ * Copyright (c) 2023 Vendicated and Vencord contributors */ -import { createWriteStream } from "fs"; +import { createWriteStream } from "original-fs"; import { Readable } from "stream"; import { pipeline } from "stream/promises"; import { setTimeout } from "timers/promises"; diff --git a/src/main/utils/vencordLoader.ts b/src/main/utils/vencordLoader.ts index c0bac6a..6224ca7 100644 --- a/src/main/utils/vencordLoader.ts +++ b/src/main/utils/vencordLoader.ts @@ -4,22 +4,14 @@ * Copyright (c) 2023 Vendicated and Vencord contributors */ -import { mkdirSync } from "fs"; -import { access, constants as FsConstants } from "fs/promises"; +import { existsSync } from "fs"; import { join } from "path"; -import { USER_AGENT, VENCORD_FILES_DIR } from "../constants"; +import { USER_AGENT, VENCORD_DIR } from "../constants"; import { downloadFile, fetchie } from "./http"; const API_BASE = "https://api.github.com"; -export const FILES_TO_DOWNLOAD = [ - "vencordDesktopMain.js", - "vencordDesktopPreload.js", - "vencordDesktopRenderer.js", - "vencordDesktopRenderer.css" -]; - export interface ReleaseData { name: string; tag_name: string; @@ -43,33 +35,21 @@ export async function githubGet(endpoint: string) { return fetchie(API_BASE + endpoint, opts, { retryOnNetworkError: true }); } -export async function downloadVencordFiles() { - const release = await githubGet("/repos/Vendicated/Vencord/releases/latest"); - - const { assets }: ReleaseData = await release.json(); - - await Promise.all( - assets - .filter(({ name }) => FILES_TO_DOWNLOAD.some(f => name.startsWith(f))) - .map(({ name, browser_download_url }) => - downloadFile(browser_download_url, join(VENCORD_FILES_DIR, name), {}, { retryOnNetworkError: true }) - ) +export async function downloadVencordAsar() { + await downloadFile( + "https://github.com/Vendicated/Vencord/releases/latest/download/vesktop.asar", + VENCORD_DIR, + {}, + { retryOnNetworkError: true } ); } -const existsAsync = (path: string) => - access(path, FsConstants.F_OK) - .then(() => true) - .catch(() => false); - -export async function isValidVencordInstall(dir: string) { - return Promise.all(FILES_TO_DOWNLOAD.map(f => existsAsync(join(dir, f)))).then(arr => !arr.includes(false)); +export function isValidVencordInstall(dir: string) { + return existsSync(join(dir, "vesktop/main.js")); } export async function ensureVencordFiles() { - if (await isValidVencordInstall(VENCORD_FILES_DIR)) return; + if (existsSync(VENCORD_DIR)) return; - mkdirSync(VENCORD_FILES_DIR, { recursive: true }); - - await downloadVencordFiles(); + await downloadVencordAsar(); }