diff --git a/packages/geek-auto-start-chat-with-boss/index.mjs b/packages/geek-auto-start-chat-with-boss/index.mjs index b7b8e63..6370987 100644 --- a/packages/geek-auto-start-chat-with-boss/index.mjs +++ b/packages/geek-auto-start-chat-with-boss/index.mjs @@ -13,13 +13,13 @@ import { readConfigFile, ensureConfigFileExist } from './runtime-file-utils.mjs' ensureConfigFileExist() const isRunFromUi = Boolean(process.env.MAIN_BOSSGEEKGO_UI_RUN_MODE) +const isUiDev = process.env.NODE_ENV === 'development' + let puppeteer, StealthPlugin export async function initPuppeteer () { // production if ( - isRunFromUi - // && - // process.mainModule.filename.indexOf('app.asar') !== -1 + isRunFromUi && !isUiDev ) { const runtimeDependencies = await import( path.join( diff --git a/packages/ui/electron.vite.config.ts b/packages/ui/electron.vite.config.ts index adb4d26..29642a6 100644 --- a/packages/ui/electron.vite.config.ts +++ b/packages/ui/electron.vite.config.ts @@ -6,7 +6,7 @@ export default defineConfig({ main: { build: { rollupOptions: { - external: ['puppeteer', 'puppeteer-extra', 'puppeteer-extra-plugin-stealth'] + external: ['puppeteer', 'puppeteer-extra', 'puppeteer-extra-plugin-stealth', '@puppeteer/browsers'] } }, plugins: [ diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer.ts index 6e91b62..b9070a1 100644 --- a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer.ts +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer.ts @@ -2,6 +2,7 @@ import * as path from 'node:path' import * as os from 'node:os' import * as fs from 'node:fs' import type { InstalledBrowser } from '@puppeteer/browsers' +import { isDev } from '../../runtimeDesidedEnv' const expectBuildId = process.env.EXPECT_CHROME_FOR_PUPPETEER_BUILD_ID || '121.0.6167.85' const cacheDir = path.join( @@ -11,22 +12,40 @@ const cacheDir = path.join( 'static' ) -const checkAndDownloadPuppeteer = async (options: { - downloadProgressCallback?: (downloadedBytes: number, totalBytes: number) => void -}) => { - const puppeteerManager = await import('@puppeteer/browsers') - const executablePath = puppeteerManager.computeExecutablePath({ +const getPuppeteerManagerModule = async () => { + if (!isDev) { + const runtimeDependencies = await import( + path.join(os.homedir(), '.bossgeekgo', 'external-node-runtime-dependencies/index.mjs') + ) + return runtimeDependencies.puppeteerManager + } else { + const importResult = await import('@puppeteer/browsers') + return importResult + } +} + +export const getExpectPuppeteerExecutablePath = async () => { + const puppeteerManager = await getPuppeteerManagerModule() + + return puppeteerManager.computeExecutablePath({ browser: puppeteerManager.Browser.CHROME, cacheDir, buildId: expectBuildId }) +} + +const checkAndDownloadPuppeteer = async (options: { + downloadProgressCallback?: (downloadedBytes: number, totalBytes: number) => void +}) => { + const puppeteerManager = await getPuppeteerManagerModule() + const executablePath = await getExpectPuppeteerExecutablePath() let installedBrowser: InstalledBrowser if (!fs.existsSync(executablePath)) { // maybe the exist installation is broken. await puppeteerManager.uninstall({ cacheDir, buildId: expectBuildId, - browser: puppeteerManager.Browser.CHROME, + browser: puppeteerManager.Browser.CHROME }) installedBrowser = await puppeteerManager.install({ browser: puppeteerManager.Browser.CHROME, diff --git a/packages/ui/src/main/runtimeDesidedEnv.ts b/packages/ui/src/main/runtimeDesidedEnv.ts new file mode 100644 index 0000000..0a346c5 --- /dev/null +++ b/packages/ui/src/main/runtimeDesidedEnv.ts @@ -0,0 +1 @@ +export const isDev = process.env.NODE_ENV === 'development' diff --git a/packages/ui/src/main/window/mainWindow.ts b/packages/ui/src/main/window/mainWindow.ts index 1c8cea9..fd20ca9 100644 --- a/packages/ui/src/main/window/mainWindow.ts +++ b/packages/ui/src/main/window/mainWindow.ts @@ -9,6 +9,8 @@ import { writeConfigFile } from '@bossgeekgo/geek-auto-start-chat-with-boss/runtime-file-utils.mjs' import { ChildProcess } from 'child_process' +import { isDev } from '../runtimeDesidedEnv' +import { getExpectPuppeteerExecutablePath } from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer' let mainWindow: BrowserWindow export function createMainWindow(): void { @@ -20,8 +22,8 @@ export function createMainWindow(): void { autoHideMenuBar: true, ...(process.platform === 'linux' ? { - /* icon */ - } + /* icon */ + } : {}), webPreferences: { preload: path.join(__dirname, '../preload/index.js'), @@ -85,13 +87,18 @@ export function createMainWindow(): void { if (subProcessOfPuppeteer) { return } - console.log(process) + + const subProcessEnv = { + ...process.env, + MAIN_BOSSGEEKGO_UI_RUN_MODE: 'geekAutoStartWithBoss' + } + if (!isDev) { + Object.assign(subProcessEnv, { + PUPPETEER_EXECUTABLE_PATH: await getExpectPuppeteerExecutablePath() + }) + } subProcessOfPuppeteer = childProcess.spawn(process.argv[0], process.argv.slice(1), { - env: { - ...process.env, - MAIN_BOSSGEEKGO_UI_RUN_MODE: 'geekAutoStartWithBoss' - // PUPPETEER_EXECUTABLE_PATH: '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge' - }, + env: subProcessEnv, stdio: [null, null, null, 'pipe'] }) subProcessOfPuppeteer.once('exit', () => { @@ -103,11 +110,15 @@ export function createMainWindow(): void { return new Promise((resolve) => { subProcessOfPuppeteer!.stdio[3]!.on('data', (raw) => { const data = JSON.parse(raw.toString()) - if (data.type === 'PUPPETEER_MAY_NOT_INSTALLED') { - resolve(data) - } - if (data.type === 'GEEK_AUTO_START_CHAT_WITH_BOSS_STARTED') { - resolve(data) + switch (data.type) { + case 'GEEK_AUTO_START_CHAT_WITH_BOSS_STARTED': + case 'PUPPETEER_MAY_NOT_INSTALLED': { + resolve(data) + break + } + default: { + return + } } }) })