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
JavaScript
;
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