import different puppeteer for prod and dev environments. prod use home folder one, dev use local node_modules one. add logic for download puppeteer.

This commit is contained in:
bossgeekgo
2024-02-15 00:26:22 +08:00
parent bd572bc6c1
commit 6c70993d97
5 changed files with 54 additions and 23 deletions
@@ -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(
+1 -1
View File
@@ -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: [
@@ -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,
@@ -0,0 +1 @@
export const isDev = process.env.NODE_ENV === 'development'
+24 -13
View File
@@ -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
}
}
})
})