/** * Client entry point */ import { loadClientConfig } from '../config/manager.js'; import { checkUsbipInstalled, loadModules } from '../usbip/commands.js'; import { LogLevel, logger } from '../utils/logger.js'; import { ConnectionHandler } from './connection-handler.js'; import { DeviceManager } from './device-manager.js'; /** * Start client */ export async function startClient(configPath?: string): Promise { try { logger.info('Starting USB/IP Supervisor Client...'); // Check if usbip is installed const usbipInstalled = await checkUsbipInstalled(); if (!usbipInstalled) { logger.error('usbip is not installed. Please install usbip-utils package.'); process.exit(1); } // Try to load kernel modules try { await loadModules(); } catch (error) { logger.warn('USBIP kernel modules are not loaded. Will attempt to load them.'); } // Load configuration const config = await loadClientConfig(configPath); // Set log level if (config.logLevel) { logger.setLevel(LogLevel[config.logLevel.toUpperCase() as keyof typeof LogLevel]); } logger.info(`Client ID: ${config.clientId}`); logger.info(`Servers: ${config.servers.length}`); for (const server of config.servers) { logger.info( ` - ${server.name} (${server.address}:${server.port}) - ${server.devices.length} device(s)` ); } // Initialize connection handler const connectionHandler = new ConnectionHandler(config.clientId, config.servers); // Initialize device manager const sendMessage = (serverName: string, message: any) => { connectionHandler.sendMessage(serverName, message); }; const deviceManager = new DeviceManager(config.servers, sendMessage); // Link them together connectionHandler.setDeviceManager(deviceManager); // Start device management await deviceManager.start(); // Connect to all servers await connectionHandler.connectToAllServers(); logger.info('Client started successfully'); // Handle graceful shutdown const shutdown = async () => { logger.info('Shutting down client...'); await deviceManager.stop(); await connectionHandler.disconnect(); logger.info('Client stopped'); process.exit(0); }; process.on('SIGINT', shutdown); process.on('SIGTERM', shutdown); } catch (error) { logger.error(`Failed to start client: ${error}`); process.exit(1); } }