96 lines · 3.3 KB · TypeScript
RawDownload
/** * Context IPC Handlers - Manages context switching and listing. * * Channels: * - context:list - List all available contexts (local + SSH) * - context:getActive - Get current active context ID * - context:switch - Switch to a different context */ import { createLogger } from '@shared/utils/logger'; // Channel constants (mirrored from preload/constants/ipcChannels.ts to respect module boundaries)const CONTEXT_LIST = 'context:list';const CONTEXT_GET_ACTIVE = 'context:getActive';const CONTEXT_SWITCH = 'context:switch'; import type { ServiceContext, ServiceContextRegistry } from '../services';import type { IpcMain } from 'electron'; const logger = createLogger('IPC:context'); // =============================================================================// Module State// ============================================================================= let registry: ServiceContextRegistry;let onContextRewire: (context: ServiceContext) => void; // =============================================================================// Initialization// ============================================================================= /** * Initialize context handlers with required services. * @param contextRegistry - The service context registry * @param onRewire - Rewire-only callback (no renderer notification) for renderer-initiated switches */export function initializeContextHandlers(  contextRegistry: ServiceContextRegistry,  onRewire: (context: ServiceContext) => void): void {  registry = contextRegistry;  onContextRewire = onRewire;} // =============================================================================// Handler Registration// ============================================================================= export function registerContextHandlers(ipcMain: IpcMain): void {  ipcMain.handle(CONTEXT_LIST, async () => {    try {      const contexts = registry.list();      return { success: true, data: contexts };    } catch (err) {      const message = err instanceof Error ? err.message : String(err);      logger.error('Failed to list contexts:', message);      return { success: false, error: message };    }  });   ipcMain.handle(CONTEXT_GET_ACTIVE, async () => {    try {      const activeContextId = registry.getActiveContextId();      return { success: true, data: activeContextId };    } catch (err) {      const message = err instanceof Error ? err.message : String(err);      logger.error('Failed to get active context:', message);      return { success: false, error: message };    }  });   ipcMain.handle(CONTEXT_SWITCH, async (_event, contextId: string) => {    try {      // Switch to the new context      const { current } = registry.switch(contextId);       // Re-wire file watcher events only (no renderer notification — renderer initiated this switch)      onContextRewire(current);       return { success: true, data: { contextId } };    } catch (err) {      const message = err instanceof Error ? err.message : String(err);      logger.error(`Context switch to "${contextId}" failed:`, message);      return { success: false, error: message };    }  });   logger.info('Context handlers registered');} export function removeContextHandlers(ipcMain: IpcMain): void {  ipcMain.removeHandler(CONTEXT_LIST);  ipcMain.removeHandler(CONTEXT_GET_ACTIVE);  ipcMain.removeHandler(CONTEXT_SWITCH);}