UNPKG

network-performance-monitor

Version:

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

172 lines 7.55 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Scheduler = void 0; const cron = __importStar(require("node-cron")); const dnsTest_1 = require("./dnsTest"); const pingTest_1 = require("./pingTest"); const websiteTest_1 = require("./websiteTest"); const speedTest_1 = require("./speedTest"); const logger_1 = require("./logger"); const networkInfo_1 = require("./networkInfo"); class Scheduler { db; dnsTest; pingTest; websiteTest; speedTest; config; regularCheckTask; speedTestTask; isRunning = false; networkDetector; constructor(db, config) { this.db = db; this.config = config; this.dnsTest = new dnsTest_1.DnsTest(db); this.pingTest = new pingTest_1.PingTest(db); this.websiteTest = new websiteTest_1.WebsiteTest(db); this.speedTest = new speedTest_1.SpeedTest(db); this.networkDetector = networkInfo_1.NetworkDetector.getInstance(); } async start() { if (this.isRunning) { logger_1.logger.warn('Scheduler is already running'); return; } this.isRunning = true; logger_1.logger.info('Starting network performance monitor scheduler'); // Run initial tests (no speed test on startup) await this.runRegularTests(); // Schedule regular tests (every minute or custom interval) this.regularCheckTask = setInterval(async () => { await this.runRegularTests(); }, this.config.regularCheckInterval); // Schedule speed tests (at the top of every hour or custom interval) if (this.config.testMode) { // In test mode, use interval instead of cron logger_1.logger.info(`Test mode enabled: Running speed test every ${this.config.speedTestInterval}ms`); // Run an immediate speed test in test mode await this.runSpeedTest('scheduled'); // Then set up interval for subsequent tests setInterval(async () => { await this.runSpeedTest('scheduled'); }, this.config.speedTestInterval); } else { // In production mode, run at the top of every hour logger_1.logger.info('Setting up cron job for speed tests at the top of every hour'); // Create cron job - node-cron creates jobs in stopped state by default this.speedTestTask = cron.schedule('0 * * * *', async () => { logger_1.logger.info('Cron job triggered for scheduled speed test'); await this.runSpeedTest('scheduled'); }); // Start the cron job this.speedTestTask.start(); logger_1.logger.info('Cron job started successfully'); // Also log next scheduled time for debugging const now = new Date(); const nextHour = new Date(now); nextHour.setHours(now.getHours() + 1, 0, 0, 0); logger_1.logger.info(`Next speed test scheduled for: ${nextHour.toLocaleString()}`); } logger_1.logger.info('Scheduler started successfully'); } async stop() { if (!this.isRunning) { logger_1.logger.warn('Scheduler is not running'); return; } this.isRunning = false; if (this.regularCheckTask) { clearInterval(this.regularCheckTask); } if (this.speedTestTask) { this.speedTestTask.stop(); } logger_1.logger.info('Scheduler stopped'); } async runRegularTests() { logger_1.logger.info('Running regular network tests'); try { // Force refresh network info to detect any network changes const previousNetwork = await this.networkDetector.getCurrentNetwork(); const networkInfo = await this.networkDetector.getCurrentNetwork(true); const networkName = networkInfo.name; // Log if network changed if (previousNetwork.name !== networkName) { logger_1.logger.warn(`Network changed from "${previousNetwork.name}" to "${networkName}"`); } logger_1.logger.info(`Running tests on network: ${networkName}`); // Run all tests in parallel const [dnsResults, pingResults, websiteResults] = await Promise.all([ this.dnsTest.testAllServers(networkName), this.pingTest.testAllHosts(networkName), this.websiteTest.testAllWebsites(networkName) ]); // Check for anomalies const dnsAnomaly = await this.dnsTest.checkForAnomalies(dnsResults); const pingAnomaly = await this.pingTest.checkForAnomalies(pingResults); const websiteAnomaly = await this.websiteTest.checkForAnomalies(websiteResults); // If any anomaly detected, trigger speed test if (dnsAnomaly || pingAnomaly || websiteAnomaly) { logger_1.logger.warn('Network anomaly detected, triggering speed test'); await this.runSpeedTest('anomaly'); } logger_1.logger.info('Regular network tests completed'); } catch (error) { logger_1.logger.error('Error running regular tests', { error: error instanceof Error ? error.message : 'Unknown error' }); } } async runSpeedTest(triggerReason) { logger_1.logger.info(`Running speed test (trigger: ${triggerReason})`); try { // Force refresh network info to detect any network changes const networkInfo = await this.networkDetector.getCurrentNetwork(true); const networkName = networkInfo.name; const result = await this.speedTest.runTest(triggerReason, networkName); logger_1.logger.info(this.speedTest.formatResult(result)); } catch (error) { logger_1.logger.error('Error running speed test', { error: error instanceof Error ? error.message : 'Unknown error' }); } } isActive() { return this.isRunning; } } exports.Scheduler = Scheduler; //# sourceMappingURL=scheduler.js.map