feat: add IPC handlers for Playwright browser download

This commit is contained in:
Misaka_Company
2026-03-24 15:41:09 +08:00
parent 32df3cea67
commit 6ad916998c
2 changed files with 72 additions and 0 deletions

View File

@@ -16,6 +16,7 @@ import { registerUserErpConfigHandlers } from './user-erp-config-handler'
import { registerLoggerHandlers } from './logger-handler' import { registerLoggerHandlers } from './logger-handler'
import { registerReportHandlers } from './report-handler' import { registerReportHandlers } from './report-handler'
import { registerUpdateHandlers } from './update-handler' import { registerUpdateHandlers } from './update-handler'
import { registerPlaywrightBrowserHandlers } from './playwright-browser'
import { createLogger, logError } from '../services/logger' import { createLogger, logError } from '../services/logger'
import { serializeError, sanitizeError } from '../services/logger/error-utils' import { serializeError, sanitizeError } from '../services/logger/error-utils'
import { getErrorMessage, getErrorCode, isBaseError } from '../types/errors' import { getErrorMessage, getErrorCode, isBaseError } from '../types/errors'
@@ -105,5 +106,6 @@ export function registerIpcHandlers(): void {
registerLoggerHandlers() registerLoggerHandlers()
registerReportHandlers() registerReportHandlers()
registerUpdateHandlers() registerUpdateHandlers()
registerPlaywrightBrowserHandlers()
log.info('All IPC handlers registered') log.info('All IPC handlers registered')
} }

View File

@@ -0,0 +1,70 @@
/**
* Playwright Browser IPC Handlers
* Handles browser download requests from renderer process
*/
import { ipcMain, IpcMainInvokeEvent } from 'electron'
import { IPC_CHANNELS } from '../../shared/ipc-channels'
import { withErrorHandling, type IpcResult } from './index'
import { DownloadService } from '../services/playwright-browser'
import { ConfigManager } from '../services/config/config-manager'
import { S3Client } from '@aws-sdk/client-s3'
import type { DownloadProgress } from '../services/playwright-browser'
/**
* Create S3 client from config
*/
function createS3Client(): S3Client {
const config = ConfigManager.getInstance().getConfig().update
if (!config) {
throw new Error('Update config is not available')
}
return new S3Client({
region: config.region,
endpoint: config.endpoint,
credentials: {
accessKeyId: config.accessKey,
secretAccessKey: config.secretKey
},
forcePathStyle: true
})
}
/**
* Track active download for cancellation
*/
let activeDownload: { service: DownloadService; cancelled: boolean } | null = null
export function registerPlaywrightBrowserHandlers(): void {
ipcMain.handle(
IPC_CHANNELS.PLAYWRIGHT_BROWSER_DOWNLOAD,
async (event: IpcMainInvokeEvent): Promise<IpcResult<void>> => {
return withErrorHandling(async () => {
const s3Client = createS3Client()
const service = new DownloadService({ s3Client })
activeDownload = { service, cancelled: false }
await service.downloadAll((progress: DownloadProgress) => {
if (activeDownload?.cancelled) {
throw new Error('Download cancelled by user')
}
event.sender.send(IPC_CHANNELS.PLAYWRIGHT_BROWSER_PROGRESS, progress)
})
activeDownload = null
}, 'playwright-browser:download')
}
)
ipcMain.handle(IPC_CHANNELS.PLAYWRIGHT_BROWSER_CANCEL, async (): Promise<IpcResult<void>> => {
return withErrorHandling(async () => {
if (activeDownload) {
activeDownload.cancelled = true
activeDownload = null
}
}, 'playwright-browser:cancel')
})
}