mirror of
https://github.com/geekgeekrun/geekgeekrun.git
synced 2026-08-06 05:54:03 +08:00
use unified chrome instance to handle open-site-with-boss-cookie - for handleLaunchBossSite and handleViewJobOnlineButtonClick in ui
This commit is contained in:
@@ -16,6 +16,8 @@ import path from 'node:path'
|
||||
import url from 'url'
|
||||
import packageJson from '@geekgeekrun/launch-bosszhipin-login-page-with-preload-extension/package.json' assert { type: 'json' }
|
||||
import { Target } from 'puppeteer'
|
||||
import { pipeWriteRegardlessError } from '../utils/pipe'
|
||||
import * as JSONStream from 'JSONStream'
|
||||
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
|
||||
const isRunFromUi = Boolean(process.env.MAIN_BOSSGEEKGO_UI_RUN_MODE)
|
||||
@@ -125,6 +127,35 @@ export async function launchBossSite() {
|
||||
const localStoragePageUrl = `https://www.zhipin.com/desktop/`
|
||||
await setDomainLocalStorage(browser, localStoragePageUrl, bossLocalStorage)
|
||||
|
||||
//#region pipe
|
||||
let pipeForWrite: null | fs.WriteStream = null
|
||||
let pipeForRead: null | fs.ReadStream = null
|
||||
try {
|
||||
pipeForWrite = fs.createWriteStream(null, { fd: 3 })
|
||||
} catch {
|
||||
console.warn('pipeForWrite is not available')
|
||||
}
|
||||
try {
|
||||
pipeForRead = fs.createReadStream(null, { fd: 3 })
|
||||
} catch {
|
||||
console.warn('pipeForRead is not available')
|
||||
}
|
||||
pipeForRead?.pipe(JSONStream.parse())?.on('data', async function handler(data) {
|
||||
if (data.type !== 'NEW_WINDOW') {
|
||||
return
|
||||
}
|
||||
const page = await browser.newPage()
|
||||
await page.goto(data.url)
|
||||
})
|
||||
|
||||
pipeWriteRegardlessError(
|
||||
pipeForWrite,
|
||||
JSON.stringify({
|
||||
type: 'SUB_PROCESS_OF_OPEN_BOSS_SITE_READY'
|
||||
})
|
||||
)
|
||||
//#endregion
|
||||
|
||||
browser.on('targetcreated', (target) => {
|
||||
attachRequestsListener(target)
|
||||
})
|
||||
@@ -135,11 +166,16 @@ export async function launchBossSite() {
|
||||
}
|
||||
const cp = browser.process()
|
||||
cp.kill()
|
||||
pipeWriteRegardlessError(
|
||||
pipeForWrite,
|
||||
JSON.stringify({
|
||||
type: 'SUB_PROCESS_OF_OPEN_BOSS_SITE_CAN_BE_KILLED'
|
||||
})
|
||||
)
|
||||
process.exit(0)
|
||||
})
|
||||
|
||||
const newPage = await await browser.newPage()
|
||||
const tempPage = await browser.newPage()
|
||||
await page.close()
|
||||
page = newPage
|
||||
await page.goto('https://www.zhipin.com/web/user/')
|
||||
page = tempPage
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ import {
|
||||
getJobLibrary
|
||||
} from '../utils/db/index'
|
||||
import { PageReq } from '../../../../common/types/pagination'
|
||||
import { pipeWriteRegardlessError } from '../../utils/pipe'
|
||||
import { WriteStream } from 'node:fs'
|
||||
|
||||
export default function initIpc() {
|
||||
ipcMain.on('open-external-link', (_, link) => {
|
||||
@@ -286,42 +288,65 @@ export default function initIpc() {
|
||||
return a
|
||||
})
|
||||
|
||||
let subProcessOfOpenBossSite: ChildProcess | undefined
|
||||
let subProcessOfOpenBossSiteLaunching = false
|
||||
ipcMain.handle('open-boss-site', async () => {
|
||||
if (subProcessOfOpenBossSiteLaunching) {
|
||||
return
|
||||
}
|
||||
subProcessOfOpenBossSiteLaunching = true
|
||||
const defer = Promise.withResolvers()
|
||||
if (subProcessOfOpenBossSite) {
|
||||
subProcessOfOpenBossSite.once('exit', defer.resolve)
|
||||
subProcessOfOpenBossSite.once('error', console.error)
|
||||
try {
|
||||
process.kill(subProcessOfOpenBossSite.pid!)
|
||||
await sleep(500)
|
||||
process.kill(subProcessOfOpenBossSite.pid!, 'SIGKILL')
|
||||
} catch {
|
||||
defer.resolve(undefined)
|
||||
let subProcessOfOpenBossSiteDefer: null | PromiseWithResolvers<ChildProcess> = null
|
||||
let subProcessOfOpenBossSite: null | ChildProcess = null
|
||||
ipcMain.handle('open-site-with-boss-cookie', async (_, data) => {
|
||||
const url = data.url
|
||||
if (
|
||||
!subProcessOfOpenBossSiteDefer ||
|
||||
!subProcessOfOpenBossSite ||
|
||||
subProcessOfOpenBossSite.killed
|
||||
) {
|
||||
subProcessOfOpenBossSiteDefer = Promise.withResolvers()
|
||||
const puppeteerExecutable = await getAnyAvailablePuppeteerExecutable()
|
||||
const subProcessEnv = {
|
||||
...process.env,
|
||||
MAIN_BOSSGEEKGO_UI_RUN_MODE: 'launchBossSite',
|
||||
PUPPETEER_EXECUTABLE_PATH: puppeteerExecutable!.executablePath
|
||||
}
|
||||
} else {
|
||||
defer.resolve(undefined)
|
||||
subProcessOfOpenBossSite = childProcess.spawn(process.argv[0], process.argv.slice(1), {
|
||||
env: subProcessEnv,
|
||||
stdio: [null, null, null, 'pipe']
|
||||
})
|
||||
subProcessOfOpenBossSite.once('exit', () => {
|
||||
subProcessOfOpenBossSiteDefer = null
|
||||
})
|
||||
subProcessOfOpenBossSite.stdio[3]!.pipe(JSONStream.parse()).on(
|
||||
'data',
|
||||
async function handler(data) {
|
||||
switch (data?.type) {
|
||||
case 'SUB_PROCESS_OF_OPEN_BOSS_SITE_READY': {
|
||||
subProcessOfOpenBossSiteDefer!.resolve(subProcessOfOpenBossSite as ChildProcess)
|
||||
break
|
||||
}
|
||||
case 'SUB_PROCESS_OF_OPEN_BOSS_SITE_CAN_BE_KILLED': {
|
||||
try {
|
||||
subProcessOfOpenBossSite &&
|
||||
!subProcessOfOpenBossSite.killed &&
|
||||
subProcessOfOpenBossSite.pid &&
|
||||
process.kill(subProcessOfOpenBossSite.pid)
|
||||
} catch {
|
||||
//
|
||||
} finally {
|
||||
subProcessOfOpenBossSiteDefer = null
|
||||
subProcessOfOpenBossSite = null
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
defer.promise.then(() => {
|
||||
subProcessOfOpenBossSite = undefined
|
||||
})
|
||||
await defer.promise
|
||||
const puppeteerExecutable = await getAnyAvailablePuppeteerExecutable()
|
||||
const subProcessEnv = {
|
||||
...process.env,
|
||||
MAIN_BOSSGEEKGO_UI_RUN_MODE: 'launchBossSite',
|
||||
PUPPETEER_EXECUTABLE_PATH: puppeteerExecutable!.executablePath
|
||||
}
|
||||
subProcessOfOpenBossSite = childProcess.spawn(process.argv[0], process.argv.slice(1), {
|
||||
env: subProcessEnv,
|
||||
stdio: [null, null, null]
|
||||
})
|
||||
subProcessOfOpenBossSiteLaunching = false
|
||||
|
||||
await subProcessOfOpenBossSiteDefer.promise
|
||||
|
||||
pipeWriteRegardlessError(
|
||||
subProcessOfOpenBossSite!.stdio[3]! as WriteStream,
|
||||
JSON.stringify({
|
||||
type: 'NEW_WINDOW',
|
||||
url: url ?? 'about:blank'
|
||||
})
|
||||
)
|
||||
})
|
||||
|
||||
ipcMain.handle('exit-app-immediately', () => {
|
||||
|
||||
@@ -137,11 +137,10 @@ onMounted(() => {
|
||||
})
|
||||
})
|
||||
|
||||
function handleViewJobOnlineButtonClick(encryptJobId: string) {
|
||||
electron.ipcRenderer.send(
|
||||
'open-external-link',
|
||||
`https://www.zhipin.com/job_detail/${encryptJobId}.html`
|
||||
)
|
||||
async function handleViewJobOnlineButtonClick(encryptJobId: string) {
|
||||
return await electron.ipcRenderer.invoke('open-site-with-boss-cookie', {
|
||||
url: `https://www.zhipin.com/job_detail/${encryptJobId}.html`
|
||||
})
|
||||
}
|
||||
|
||||
const drawVisibleModelValue = ref(false)
|
||||
|
||||
@@ -36,6 +36,7 @@ import { useRouter } from 'vue-router'
|
||||
import { ElIcon } from 'element-plus'
|
||||
import { TopRight } from '@element-plus/icons-vue'
|
||||
import useBuildInfo from '@renderer/hooks/useBuildInfo'
|
||||
import { debounce } from 'lodash-es'
|
||||
const router = useRouter()
|
||||
const unmountedCbs: Array<InstanceType<typeof Function>> = []
|
||||
onUnmounted(() => {
|
||||
@@ -94,9 +95,15 @@ const handleGotoProjectPageClick = () => {
|
||||
electron.ipcRenderer.send('open-external-link', 'https://github.com/geekgeekrun/geekgeekrun')
|
||||
}
|
||||
|
||||
const handleLaunchBossSite = async () => {
|
||||
await electron.ipcRenderer.invoke('open-boss-site')
|
||||
}
|
||||
const handleLaunchBossSite = debounce(
|
||||
async () => {
|
||||
return await electron.ipcRenderer.invoke('open-site-with-boss-cookie', {
|
||||
url: `https://www.zhipin.com/`
|
||||
})
|
||||
},
|
||||
1000,
|
||||
{ leading: true, trailing: false }
|
||||
)
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
Reference in New Issue
Block a user