UNPKG

network-performance-monitor

Version:

A comprehensive network performance monitoring tool that continuously tests and tracks your network's performance over time

117 lines 4.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const database_1 = require("./database"); const scheduler_1 = require("./scheduler"); const pidfile_1 = require("./pidfile"); const logger_1 = require("./logger"); const configLoader_1 = require("./configLoader"); const webServer_1 = require("./webServer"); class Daemon { db; scheduler; pidFile; webServer; port; constructor() { const config = (0, configLoader_1.loadConfig)(); // Parse command line arguments const portArg = process.argv.find((arg, index) => process.argv[index - 1] === '--port'); this.port = portArg ? parseInt(portArg) : 3000; const testModeArg = process.argv.includes('--test-mode'); const speedTestIntervalArg = process.argv.find((arg, index) => process.argv[index - 1] === '--speed-test-interval'); const speedTestInterval = speedTestIntervalArg ? parseInt(speedTestIntervalArg) : config.intervals.speedTest; // Check for custom database path from environment or args const dbPath = process.env.DB_PATH || undefined; this.db = new database_1.Database(dbPath); this.scheduler = new scheduler_1.Scheduler(this.db, { regularCheckInterval: config.intervals.regularCheck, speedTestInterval: speedTestInterval, testMode: testModeArg }); this.pidFile = new pidfile_1.PidFile(); this.webServer = new webServer_1.WebServer(this.db, this.port); } async start() { try { // Check if daemon is already running if (this.pidFile.isDaemonRunning()) { console.error('Daemon is already running'); process.exit(1); } // Write PID file this.pidFile.write(); logger_1.logger.info(`Daemon started with PID: ${process.pid}`); // Initialize database await this.db.initialize(); logger_1.logger.info('Database initialized'); // Setup signal handlers this.setupSignalHandlers(); // Start scheduler await this.scheduler.start(); // Start web server this.webServer.start(); logger_1.logger.info(`Web UI started on port ${this.port}`); // Keep the process running process.stdin.resume(); } catch (error) { logger_1.logger.error('Failed to start daemon', { error: error instanceof Error ? error.message : 'Unknown error' }); this.cleanup(); process.exit(1); } } setupSignalHandlers() { const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT']; signals.forEach(signal => { process.on(signal, async () => { logger_1.logger.info(`Received ${signal}, shutting down gracefully...`); await this.stop(); }); }); process.on('uncaughtException', (error) => { logger_1.logger.error('Uncaught exception', { error: error.message }); this.cleanup(); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { logger_1.logger.error('Unhandled rejection', { reason }); this.cleanup(); process.exit(1); }); } async stop() { try { logger_1.logger.info('Stopping daemon...'); // Stop scheduler await this.scheduler.stop(); // Stop web server this.webServer.stop(); // Clean up this.cleanup(); logger_1.logger.info('Daemon stopped successfully'); process.exit(0); } catch (error) { logger_1.logger.error('Error stopping daemon', { error: error instanceof Error ? error.message : 'Unknown error' }); process.exit(1); } } cleanup() { try { // Close database this.db.close(); // Remove PID file this.pidFile.remove(); } catch (error) { logger_1.logger.error('Error during cleanup', { error: error instanceof Error ? error.message : 'Unknown error' }); } } } // Start the daemon const daemon = new Daemon(); daemon.start().catch(error => { console.error('Failed to start daemon:', error); process.exit(1); }); //# sourceMappingURL=daemon.js.map