mirror of
https://github.com/geekgeekrun/geekgeekrun.git
synced 2026-09-08 00:47:15 +08:00
use exitCode and promise to check if puppeteer has been setup. migrate start install logic to DependenciesSetupProgressIndicatorDialog/index.vue
This commit is contained in:
@@ -1,6 +1,11 @@
|
|||||||
|
import { app } from 'electron'
|
||||||
import checkAndDownloadPuppeteer from './check-and-download-puppeteer'
|
import checkAndDownloadPuppeteer from './check-and-download-puppeteer'
|
||||||
import * as net from 'net'
|
import * as net from 'net'
|
||||||
|
|
||||||
|
export enum DOWNLOAD_ERROR_EXIT_CODE {
|
||||||
|
NO_ERROR = 0,
|
||||||
|
DOWNLOAD_ERROR = 1
|
||||||
|
}
|
||||||
export const checkAndDownloadDependenciesForInit = async () => {
|
export const checkAndDownloadDependenciesForInit = async () => {
|
||||||
let pipe: null | net.Socket = null
|
let pipe: null | net.Socket = null
|
||||||
try {
|
try {
|
||||||
@@ -15,9 +20,8 @@ export const checkAndDownloadDependenciesForInit = async () => {
|
|||||||
}) + '\r\n'
|
}) + '\r\n'
|
||||||
)
|
)
|
||||||
|
|
||||||
let browser
|
|
||||||
try {
|
try {
|
||||||
browser = await checkAndDownloadPuppeteer({
|
await checkAndDownloadPuppeteer({
|
||||||
downloadProgressCallback(downloadedBytes: number, totalBytes: number) {
|
downloadProgressCallback(downloadedBytes: number, totalBytes: number) {
|
||||||
pipe?.write(
|
pipe?.write(
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
@@ -28,18 +32,8 @@ export const checkAndDownloadDependenciesForInit = async () => {
|
|||||||
) + '\r\n'
|
) + '\r\n'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
pipe?.write(
|
app.exit(DOWNLOAD_ERROR_EXIT_CODE.NO_ERROR)
|
||||||
JSON.stringify({
|
|
||||||
type: 'PUPPETEER_DOWNLOAD_FINISHED'
|
|
||||||
})
|
|
||||||
) + '\r\n'
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
pipe?.write(
|
app.exit(DOWNLOAD_ERROR_EXIT_CODE.DOWNLOAD_ERROR)
|
||||||
JSON.stringify({
|
|
||||||
type: 'PUPPETEER_DOWNLOAD_ERROR'
|
|
||||||
})
|
|
||||||
) + '\r\n'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(browser)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
getExpectPuppeteerExecutablePath
|
getExpectPuppeteerExecutablePath
|
||||||
} from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer'
|
} from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer'
|
||||||
import * as JSONStream from 'JSONStream'
|
import * as JSONStream from 'JSONStream'
|
||||||
|
import { DOWNLOAD_ERROR_EXIT_CODE } from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES'
|
||||||
let mainWindow: BrowserWindow
|
let mainWindow: BrowserWindow
|
||||||
|
|
||||||
export function createMainWindow(): void {
|
export function createMainWindow(): void {
|
||||||
@@ -134,7 +135,7 @@ export function createMainWindow(): void {
|
|||||||
return await checkPuppeteerExecutable()
|
return await checkPuppeteerExecutable()
|
||||||
})
|
})
|
||||||
|
|
||||||
let subProcessOfCheckAndDownloadDependencies: ChildProcess
|
let subProcessOfCheckAndDownloadDependencies: ChildProcess | null = null
|
||||||
ipcMain.handle('setup-dependencies', async () => {
|
ipcMain.handle('setup-dependencies', async () => {
|
||||||
if (subProcessOfCheckAndDownloadDependencies) {
|
if (subProcessOfCheckAndDownloadDependencies) {
|
||||||
return
|
return
|
||||||
@@ -152,17 +153,12 @@ export function createMainWindow(): void {
|
|||||||
stdio: [null, null, null, 'pipe']
|
stdio: [null, null, null, 'pipe']
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve, reject) => {
|
||||||
subProcessOfCheckAndDownloadDependencies!.stdio[3]!.pipe(JSONStream.parse()).on(
|
subProcessOfCheckAndDownloadDependencies!.stdio[3]!.pipe(JSONStream.parse()).on(
|
||||||
'data',
|
'data',
|
||||||
(raw) => {
|
(raw) => {
|
||||||
const data = raw
|
const data = raw
|
||||||
switch (data.type) {
|
switch (data.type) {
|
||||||
case 'PUPPETEER_DOWNLOAD_FINISHED': {
|
|
||||||
mainWindow.webContents.send(data.type, data)
|
|
||||||
resolve(data)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'NEED_RESETUP_DEPENDENCIES':
|
case 'NEED_RESETUP_DEPENDENCIES':
|
||||||
case 'PUPPETEER_DOWNLOAD_PROGRESS': {
|
case 'PUPPETEER_DOWNLOAD_PROGRESS': {
|
||||||
mainWindow.webContents.send(data.type, data)
|
mainWindow.webContents.send(data.type, data)
|
||||||
@@ -171,20 +167,22 @@ export function createMainWindow(): void {
|
|||||||
default: {
|
default: {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// case 'PUPPETEER_DOWNLOAD_ERROR': {
|
|
||||||
// subProcessOfCheckAndDownloadDependencies?.kill()
|
|
||||||
// pipe?.write(JSON.stringify(data) + '\r\n')
|
|
||||||
// resolve(data)
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
// case 'PUPPETEER_MAY_NOT_INSTALLED': {
|
|
||||||
// pipe?.write(JSON.stringify(data) + '\r\n')
|
|
||||||
// resolve(data)
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
subProcessOfCheckAndDownloadDependencies!.once('exit', (exitCode) => {
|
||||||
|
switch (exitCode) {
|
||||||
|
case DOWNLOAD_ERROR_EXIT_CODE.NO_ERROR: {
|
||||||
|
resolve(exitCode)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
reject(exitCode)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
subProcessOfCheckAndDownloadDependencies = null
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
+31
-4
@@ -6,14 +6,41 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref, onUnmounted } from 'vue'
|
import { ref, onUnmounted, onMounted } from 'vue'
|
||||||
|
import { ElMessageBox } from 'element-plus';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
dispose: Function
|
||||||
|
})
|
||||||
|
|
||||||
const percentage = ref(0)
|
const percentage = ref(0)
|
||||||
const handleProgress = (ev, { downloadedBytes, totalBytes }) => {
|
const handleProgress = (ev, { downloadedBytes, totalBytes }) => {
|
||||||
percentage.value = ((downloadedBytes / totalBytes) * 100)
|
percentage.value = (downloadedBytes / totalBytes) * 100
|
||||||
}
|
}
|
||||||
electron.ipcRenderer.on('PUPPETEER_DOWNLOAD_PROGRESS', handleProgress)
|
electron.ipcRenderer.on('PUPPETEER_DOWNLOAD_PROGRESS', handleProgress)
|
||||||
onUnmounted(
|
onUnmounted(() =>
|
||||||
() => electron.ipcRenderer.removeListener('PUPPETEER_DOWNLOAD_PROGRESS', handleProgress)
|
electron.ipcRenderer.removeListener('PUPPETEER_DOWNLOAD_PROGRESS', handleProgress)
|
||||||
)
|
)
|
||||||
|
const downloadProcessExitCode = ref(0)
|
||||||
|
|
||||||
|
const processDownload = async () => {
|
||||||
|
downloadProcessExitCode.value = 0
|
||||||
|
percentage.value = 0
|
||||||
|
try {
|
||||||
|
await electron.ipcRenderer.invoke('setup-dependencies')
|
||||||
|
props.dispose?.()
|
||||||
|
} catch(err) {
|
||||||
|
downloadProcessExitCode.value = 1
|
||||||
|
|
||||||
|
ElMessageBox.confirm('Encounter error while setup dependencies. Retry?')
|
||||||
|
.then(() => {
|
||||||
|
processDownload()
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
// FIXME: should exit app here
|
||||||
|
props.dispose?.()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
processDownload()
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
+2
-1
@@ -26,7 +26,8 @@ export const mountGlobalDialog = () => {
|
|||||||
modelValue: true,
|
modelValue: true,
|
||||||
onClosed() {
|
onClosed() {
|
||||||
dispose()
|
dispose()
|
||||||
}
|
},
|
||||||
|
dispose
|
||||||
}).use(ElementPlus)
|
}).use(ElementPlus)
|
||||||
app.mount(containerEl)
|
app.mount(containerEl)
|
||||||
|
|
||||||
|
|||||||
@@ -16,29 +16,7 @@ onUnmounted(() => {
|
|||||||
;(async () => {
|
;(async () => {
|
||||||
const checkDependenciesResult = await electron.ipcRenderer.invoke('check-dependencies')
|
const checkDependenciesResult = await electron.ipcRenderer.invoke('check-dependencies')
|
||||||
if (!checkDependenciesResult) {
|
if (!checkDependenciesResult) {
|
||||||
let processDialog
|
mountDependenciesSetupProgressIndicatorDialog()
|
||||||
const needWarmingUpDenpendenciesHandler = () => {
|
|
||||||
processDialog = mountDependenciesSetupProgressIndicatorDialog()
|
|
||||||
}
|
|
||||||
electron.ipcRenderer.on('NEED_RESETUP_DEPENDENCIES', needWarmingUpDenpendenciesHandler)
|
|
||||||
|
|
||||||
const handlePuppeteerDownloadFinished = () => {
|
|
||||||
processDialog?.dispose()
|
|
||||||
}
|
|
||||||
electron.ipcRenderer.once('PUPPETEER_DOWNLOAD_FINISHED', handlePuppeteerDownloadFinished)
|
|
||||||
|
|
||||||
unmountedCbs.push(
|
|
||||||
() => {
|
|
||||||
electron.ipcRenderer.removeListener('PUPPETEER_DOWNLOAD_FINISHED', handlePuppeteerDownloadFinished)
|
|
||||||
electron.ipcRenderer.removeListener('NEED_RESETUP_DEPENDENCIES', needWarmingUpDenpendenciesHandler)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
try {
|
|
||||||
await electron.ipcRenderer.invoke('setup-dependencies')
|
|
||||||
} finally {
|
|
||||||
electron.ipcRenderer.removeListener('PUPPETEER_DOWNLOAD_FINISHED', handlePuppeteerDownloadFinished)
|
|
||||||
electron.ipcRenderer.removeListener('NEED_RESETUP_DEPENDENCIES', needWarmingUpDenpendenciesHandler)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})()
|
})()
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user