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