Skip to content

Commit 554b938

Browse files
authored
Merge pull request #24 from FreeOps-Tools/dev
update
2 parents 91435de + e20cc89 commit 554b938

File tree

3 files changed

+60
-30
lines changed

3 files changed

+60
-30
lines changed

modules/analyze.js

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,45 @@ function analyzeURL(req, res) {
1919
}
2020

2121
const hostname = url.parse(urlToAnalyze).hostname;
22-
const options = {
23-
method: 'HEAD',
24-
timeout: 5000,
25-
};
26-
27-
const start = now();
28-
29-
makeHttpRequest(urlToAnalyze, options, (response, httpRequestError) => {
30-
if (httpRequestError) {
31-
console.error(`Failed to request ${urlToAnalyze}: ${httpRequestError}`);
32-
return res.json({ isUp: false, ipAddress: null, uptime: 0, responseTime: 0 });
22+
makeHttpRequest(urlToAnalyze, {}, (responseDetails, latencyMs, httpRequestError) => {
23+
if (httpRequestError || !responseDetails) {
24+
console.error(`Failed to request ${urlToAnalyze}: ${httpRequestError || 'Unknown error'}`);
25+
return res.json({ isUp: false, ipAddress: null, uptime: 0, latencyMs: 0, dnsLookupMs: 0 });
3326
}
3427

35-
const isUp = response.statusCode >= 200 && response.statusCode < 400;
28+
const isUp =
29+
responseDetails.statusCode >= 200 && responseDetails.statusCode < 400;
3630
if (!isUp) {
37-
return res.json({ isUp: false, ipAddress: null, uptime: 0, responseTime: 0 });
31+
return res.json({
32+
isUp: false,
33+
ipAddress: null,
34+
uptime: 0,
35+
latencyMs,
36+
dnsLookupMs: 0,
37+
statusCode: responseDetails.statusCode,
38+
});
3839
}
3940

40-
performDnsLookup(hostname, (ipAddress, dnsLookupError) => {
41+
performDnsLookup(hostname, ({ ipAddress, lookupMs, error: dnsLookupError }) => {
4142
if (dnsLookupError) {
4243
console.error(`Failed to lookup IP address for ${urlToAnalyze}: ${dnsLookupError}`);
4344
return res.status(500).json({ error: 'Internal server error' });
4445
}
4546

46-
// Calculate responseTime
47-
const end = now();
48-
const responseTime = ((end - start) / 1000).toFixed(2);
49-
50-
// calculate uptime
51-
const totalSeconds = (end - start) / 1000; // convert to seconds
52-
const availableSeconds = totalSeconds - (totalSeconds * 0.01); // assuming 99.99% uptime
53-
const uptime = ((availableSeconds / totalSeconds) * 100).toFixed(2);
47+
// Calculate uptime baseline on successful check
48+
const uptime = 100;
5449

55-
console.log(`isUp: ${isUp}, ipAddress: ${ipAddress}, uptime: ${uptime}%, responseTime: ${responseTime}s`);
56-
return res.json({ isUp: true, ipAddress, uptime, responseTime });
50+
console.log(
51+
`isUp: ${isUp}, ipAddress: ${ipAddress}, uptime: ${uptime}%, latencyMs: ${latencyMs}, dnsLookupMs: ${lookupMs}`
52+
);
53+
return res.json({
54+
isUp: true,
55+
ipAddress,
56+
uptime,
57+
latencyMs,
58+
dnsLookupMs: lookupMs,
59+
statusCode: responseDetails.statusCode,
60+
});
5761
});
5862
});
5963
} catch (error) {

modules/dnsLookup.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
const dns = require('dns');
2+
const now = require('performance-now');
23

34
function performDnsLookup(hostname, callback) {
5+
const start = now();
46
dns.lookup(hostname, (error, ipAddress) => {
7+
const lookupMs = Number((now() - start).toFixed(2));
58
if (error) {
6-
callback(null, error);
9+
callback({ error, lookupMs });
710
} else {
8-
callback(ipAddress);
11+
callback({ ipAddress, lookupMs });
912
}
1013
});
1114
}

modules/httpRequest.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,38 @@
11
const http = require('http');
22
const https = require('https');
3+
const now = require('performance-now');
34

4-
function makeHttpRequest(urlToAnalyze, options, callback) {
5+
function makeHttpRequest(urlToAnalyze, options = {}, callback) {
56
const protocol = urlToAnalyze.startsWith('https://') ? https : http;
7+
const requestOptions = {
8+
method: 'GET',
9+
timeout: 8000,
10+
...options,
11+
};
612

7-
const request = protocol.request(urlToAnalyze, options, (response) => {
8-
callback(response);
13+
const start = now();
14+
const request = protocol.request(urlToAnalyze, requestOptions, (response) => {
15+
// consume the response to ensure the 'end' event fires for timing accuracy
16+
response.on('data', () => {});
17+
18+
response.on('end', () => {
19+
const latencyMs = Number((now() - start).toFixed(2));
20+
callback(
21+
{
22+
statusCode: response.statusCode,
23+
headers: response.headers,
24+
},
25+
latencyMs
26+
);
27+
});
28+
});
29+
30+
request.on('timeout', () => {
31+
request.destroy(new Error('Request timed out'));
932
});
1033

1134
request.on('error', (error) => {
12-
callback(null, error);
35+
callback(null, 0, error);
1336
});
1437

1538
request.end();

0 commit comments

Comments
 (0)