From a2c70add1c8b390a368c2b7cf0452e03c5a93b64 Mon Sep 17 00:00:00 2001 From: bossgeekgo Date: Wed, 14 Feb 2024 09:55:20 +0800 Subject: [PATCH] add chrome for puppeteer downloader --- packages/ui/package.json | 4 +- .../check-and-download-puppeteer.ts | 48 +++++++++++++++++++ .../CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts | 11 +++++ packages/ui/src/main/index.ts | 5 ++ packages/ui/src/main/window/mainWindow.ts | 1 + pnpm-lock.yaml | 28 +++++++++-- 6 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer.ts create mode 100644 packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts diff --git a/packages/ui/package.json b/packages/ui/package.json index e3a93b3..ac1abbf 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -8,6 +8,7 @@ "start": "electron-vite preview", "dev": "electron-vite dev", "dev:geek-auto-start-chat-with-boss-only": "MAIN_BOSSGEEKGO_UI_RUN_MODE=geekAutoStartWithBoss electron-vite dev", + "dev:check-and-download-dependencies-for-init-only": "MAIN_BOSSGEEKGO_UI_RUN_MODE=checkAndDownloadDependenciesForInit electron-vite dev", "build": "electron-vite build", "format": "prettier --write .", "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix", @@ -21,10 +22,11 @@ "build:linux": "npm run build && electron-builder --linux" }, "dependencies": { - "@bossgeekgo/geek-auto-start-chat-with-boss": "workspace:*", "@bossgeekgo/dingtalk-plugin": "workspace:*", + "@bossgeekgo/geek-auto-start-chat-with-boss": "workspace:*", "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/utils": "^3.0.0", + "@puppeteer/browsers": "^2.0.0", "electron-updater": "^6.1.7", "element-plus": "^2.5.5", "normalize.css": "^8.0.1", 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 new file mode 100644 index 0000000..6e91b62 --- /dev/null +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer.ts @@ -0,0 +1,48 @@ +import * as path from 'node:path' +import * as os from 'node:os' +import * as fs from 'node:fs' +import type { InstalledBrowser } from '@puppeteer/browsers' + +const expectBuildId = process.env.EXPECT_CHROME_FOR_PUPPETEER_BUILD_ID || '121.0.6167.85' +const cacheDir = path.join( + os.homedir(), + '.bossgeekgo', + 'external-node-runtime-dependencies', + 'static' +) + +const checkAndDownloadPuppeteer = async (options: { + downloadProgressCallback?: (downloadedBytes: number, totalBytes: number) => void +}) => { + const puppeteerManager = await import('@puppeteer/browsers') + const executablePath = puppeteerManager.computeExecutablePath({ + browser: puppeteerManager.Browser.CHROME, + cacheDir, + buildId: expectBuildId + }) + let installedBrowser: InstalledBrowser + if (!fs.existsSync(executablePath)) { + // maybe the exist installation is broken. + await puppeteerManager.uninstall({ + cacheDir, + buildId: expectBuildId, + browser: puppeteerManager.Browser.CHROME, + }) + installedBrowser = await puppeteerManager.install({ + browser: puppeteerManager.Browser.CHROME, + cacheDir, + buildId: expectBuildId, + downloadProgressCallback: options.downloadProgressCallback + }) + } else { + installedBrowser = ( + await puppeteerManager.getInstalledBrowsers({ + cacheDir + }) + ).find((it) => it.buildId === expectBuildId)! + } + + return installedBrowser +} + +export default checkAndDownloadPuppeteer diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts new file mode 100644 index 0000000..feda2e7 --- /dev/null +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts @@ -0,0 +1,11 @@ +import checkAndDownloadPuppeteer from './check-and-download-puppeteer' + +export const checkAndDownloadDependenciesForInit = async () => { + const browser = await checkAndDownloadPuppeteer({ + downloadProgressCallback(downloadedBytes: number, totalBytes: number) { + console.log(`${downloadedBytes} / ${totalBytes}`) + } + }) + + console.log(browser) +} diff --git a/packages/ui/src/main/index.ts b/packages/ui/src/main/index.ts index f2c56c7..9e0bc9b 100644 --- a/packages/ui/src/main/index.ts +++ b/packages/ui/src/main/index.ts @@ -1,5 +1,6 @@ import { runAutoChat } from './flow/GEEK_AUTO_START_CHAT_WITH_BOSS' import { openSettingWindow } from './flow/OPEN_SETTING_WINDOW' +import { checkAndDownloadDependenciesForInit } from './flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index'; const runMode = process.env.MAIN_BOSSGEEKGO_UI_RUN_MODE switch (runMode) { @@ -7,6 +8,10 @@ switch (runMode) { runAutoChat() break } + case 'checkAndDownloadDependenciesForInit': { + checkAndDownloadDependenciesForInit() + break + } default: { openSettingWindow() break diff --git a/packages/ui/src/main/window/mainWindow.ts b/packages/ui/src/main/window/mainWindow.ts index a94d3eb..a2378b7 100644 --- a/packages/ui/src/main/window/mainWindow.ts +++ b/packages/ui/src/main/window/mainWindow.ts @@ -96,6 +96,7 @@ export function createMainWindow(): void { env: { ...process.env, MAIN_BOSSGEEKGO_UI_RUN_MODE: 'geekAutoStartWithBoss' + // PUPPETEER_EXECUTABLE_PATH: '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge' } }) ipcMain.emit('geek-auto-start-chat-with-boss-started') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 956db1a..90f376e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,6 +61,9 @@ importers: '@electron-toolkit/utils': specifier: ^3.0.0 version: 3.0.0(electron@28.2.0) + '@puppeteer/browsers': + specifier: ^2.0.0 + version: 2.0.0 electron-updater: specifier: ^6.1.7 version: 6.1.7 @@ -890,6 +893,22 @@ packages: - supports-color dev: false + /@puppeteer/browsers@2.0.0: + resolution: {integrity: sha512-3PS82/5+tnpEaUWonjAFFvlf35QHF15xqyGd34GBa5oP5EPVfFXRsbSxIGYf1M+vZlqBZ3oxT1kRg9OYhtt8ng==} + engines: {node: '>=18'} + hasBin: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + /@rollup/pluginutils@5.1.0: resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -1045,7 +1064,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 18.19.9 + '@types/node': 18.19.15 '@types/responselike': 1.0.3 /@types/debug@4.1.12: @@ -1073,7 +1092,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.19.9 + '@types/node': 18.19.15 /@types/lodash-es@4.17.12: resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -1092,7 +1111,6 @@ packages: resolution: {integrity: sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==} dependencies: undici-types: 5.26.5 - optional: true /@types/node@18.19.9: resolution: {integrity: sha512-oZFKlC8l5YtzGQNT4zC2PiSSKzQVZ8bAwwd+EYdPLtyk0nSEq6O16SkK+rkkT2eflDAbormJgEF3QnH3oDrTSw==} @@ -1102,7 +1120,7 @@ packages: /@types/plist@3.0.5: resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} dependencies: - '@types/node': 18.19.9 + '@types/node': 18.19.15 xmlbuilder: 15.1.1 dev: true optional: true @@ -1110,7 +1128,7 @@ packages: /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 18.19.9 + '@types/node': 18.19.15 /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==}