You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.5 KiB
JavaScript
140 lines
3.5 KiB
JavaScript
var NPINGS = 6;
|
|
var TIMEOUT = 3000;
|
|
|
|
function img_ping(host, callback, avg, count) {
|
|
var start;
|
|
|
|
var avg = avg || 0;
|
|
if (typeof(count) === 'undefined') {
|
|
// -1 to ignore the first ping, so the DNS lookup does not change
|
|
// the average time.
|
|
count = -1;
|
|
callback('...');
|
|
}
|
|
count = count + 1;
|
|
|
|
|
|
if (count > 0) {
|
|
// no timeout for the first ping, DNS can be slow
|
|
var timer = setTimeout(function() {
|
|
callback('timeout');
|
|
}, TIMEOUT);
|
|
}
|
|
|
|
function ok() {
|
|
var time = new Date() - start;
|
|
|
|
clearTimeout(timer);
|
|
|
|
if (count > 0) {
|
|
avg = ((avg * (count-1)) + time) / (count);
|
|
} else {
|
|
avg = 0;
|
|
}
|
|
|
|
if (count >= NPINGS) {
|
|
callback(Math.round(avg) + 'ms');
|
|
} else {
|
|
ping(host, callback, avg, count);
|
|
}
|
|
}
|
|
|
|
|
|
var img = new Image();
|
|
img.onload = ok;
|
|
img.onerror = ok;
|
|
|
|
start = new Date();
|
|
img.src = 'http://' + host + '/ping';
|
|
|
|
callback('...');
|
|
}
|
|
|
|
function perf_ping(host, callback, start) {
|
|
if (start == undefined) {
|
|
var perfEntries = performance.getEntries();
|
|
// use the last perf entry to ignore any request preceding
|
|
// this ping() call
|
|
start = 0;
|
|
for (var i = 0; i < perfEntries.length; i++) {
|
|
if (start < perfEntries[i].startTime) {
|
|
start = perfEntries[i].startTime;
|
|
}
|
|
}
|
|
console.log("start: " + start);
|
|
}
|
|
|
|
var timer = setTimeout(function() {
|
|
callback('timeout');
|
|
}, TIMEOUT);
|
|
|
|
var url = 'http://' + host + '/ping';
|
|
var random_thing = "?" + String(Math.random()).slice(2)
|
|
|
|
function ok() {
|
|
clearTimeout(timer);
|
|
|
|
var average = 0;
|
|
var count = 0;
|
|
|
|
var perfEntries = performance.getEntries();
|
|
for (var i = 0; i < perfEntries.length; i++) {
|
|
var e = perfEntries[i];
|
|
|
|
// ignore old entries
|
|
if (e.startTime < start) {
|
|
continue;
|
|
}
|
|
|
|
// ignore other stuff
|
|
if (e.name.slice(0, url.length) != url || e.entryType != 'resource') {
|
|
continue;
|
|
}
|
|
|
|
var time = e.duration - Math.max(e.requestStart - e.startTime, 0);
|
|
average = (average*count + time) / (count+1);
|
|
count += 1;
|
|
}
|
|
|
|
if (count < NPINGS) {
|
|
ping(host, callback, count, start);
|
|
return;
|
|
}
|
|
|
|
average -= 2; // average difference to a simple icmp ping
|
|
callback(Math.round(average) + 'ms');
|
|
}
|
|
|
|
var img = new Image();
|
|
img.onload = ok;
|
|
img.onerror = ok;
|
|
img.src = url + random_thing;
|
|
callback('...');
|
|
}
|
|
|
|
var ping = (performance) ? perf_ping : img_ping;
|
|
|
|
window.addEventListener('load', function() {
|
|
var lines = document.getElementsByClassName('host_line');
|
|
for (var i=0; i<lines.length; i++) {
|
|
var line = lines[i];
|
|
|
|
var ping_link = document.createElement('a');
|
|
ping_link.href = '#';
|
|
ping_link.innerHTML = '[ping]';
|
|
ping_link.onclick = (function(line) {
|
|
return function() {
|
|
var host = line.children[0].innerHTML;
|
|
console.log("ping: " + host);
|
|
result = ping(host,
|
|
function(r) {
|
|
line.children[1].innerHTML = '[ping: '+r+']';
|
|
});
|
|
return false;
|
|
}
|
|
})(line);
|
|
line.appendChild(ping_link);
|
|
}
|
|
}, false);
|
|
|