Files
gridpilot.gg/apps/companion/main/ipc-handlers.ts

111 lines
4.1 KiB
TypeScript

import { ipcMain } from 'electron';
import type { BrowserWindow, IpcMainInvokeEvent } from 'electron';
import { DIContainer } from './di-container';
import type { HostedSessionConfig } from '@/packages/domain/entities/HostedSessionConfig';
import { StepId } from '@/packages/domain/value-objects/StepId';
import { MockAutomationEngineAdapter } from '@/packages/infrastructure/adapters/automation/MockAutomationEngineAdapter';
export function setupIpcHandlers(mainWindow: BrowserWindow): void {
const container = DIContainer.getInstance();
const startAutomationUseCase = container.getStartAutomationUseCase();
const sessionRepository = container.getSessionRepository();
const automationEngine = container.getAutomationEngine();
ipcMain.handle('start-automation', async (_event: IpcMainInvokeEvent, config: HostedSessionConfig) => {
try {
// Connect to browser first (required for dev mode)
const connectionResult = await container.initializeBrowserConnection();
if (!connectionResult.success) {
return { success: false, error: connectionResult.error };
}
const result = await startAutomationUseCase.execute(config);
const session = await sessionRepository.findById(result.sessionId);
if (session) {
// Start the automation by executing step 1
await automationEngine.executeStep(StepId.create(1), config);
}
// Set up progress monitoring
const checkInterval = setInterval(async () => {
const updatedSession = await sessionRepository.findById(result.sessionId);
if (!updatedSession) {
clearInterval(checkInterval);
return;
}
mainWindow.webContents.send('session-progress', {
sessionId: result.sessionId,
currentStep: updatedSession.currentStep.value,
state: updatedSession.state.value,
completedSteps: Array.from({ length: updatedSession.currentStep.value - 1 }, (_, i) => i + 1),
hasError: updatedSession.errorMessage !== undefined,
errorMessage: updatedSession.errorMessage || null
});
if (updatedSession.state.value === 'COMPLETED' ||
updatedSession.state.value === 'FAILED' ||
updatedSession.state.value === 'STOPPED_AT_STEP_18') {
clearInterval(checkInterval);
}
}, 100);
return {
success: true,
sessionId: result.sessionId
};
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
};
}
});
ipcMain.handle('get-session-status', async (_event: IpcMainInvokeEvent, sessionId: string) => {
const session = await sessionRepository.findById(sessionId);
if (!session) {
return { found: false };
}
return {
found: true,
currentStep: session.currentStep.value,
state: session.state.value,
completedSteps: Array.from({ length: session.currentStep.value - 1 }, (_, i) => i + 1),
hasError: session.errorMessage !== undefined,
errorMessage: session.errorMessage || null
};
});
ipcMain.handle('pause-automation', async (_event: IpcMainInvokeEvent, _sessionId: string) => {
return { success: false, error: 'Pause not implemented in POC' };
});
ipcMain.handle('resume-automation', async (_event: IpcMainInvokeEvent, _sessionId: string) => {
return { success: false, error: 'Resume not implemented in POC' };
});
ipcMain.handle('stop-automation', async (_event: IpcMainInvokeEvent, sessionId: string) => {
try {
// Stop the automation engine interval
const engine = automationEngine as MockAutomationEngineAdapter;
engine.stopAutomation();
// Update session state to failed with user stop reason
const session = await sessionRepository.findById(sessionId);
if (session) {
session.fail('User stopped automation');
await sessionRepository.update(session);
}
return { success: true };
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
};
}
});
}