// var startTime; // var endTime; var testConnectionSpeed = { imageAddr: 'https://upload.wikimedia.org/wikipedia/commons/a/a6/Brandenburger_Tor_abends.jpg', // this is just an example, you rather want an image hosted on your server downloadSize: 2707459, // this must match with the image above getConnectionSpeed: function(callback) { testConnectionSpeed.InitiateSpeedDetection(); testConnectionSpeed.callback = callback; }, InitiateSpeedDetection: function() { window.setTimeout(testConnectionSpeed.MeasureConnectionSpeed, 1); }, result: function() { var duration = (endTime - startTime) / 1000; var bitsLoaded = testConnectionSpeed.downloadSize * 8; var speedBps = (bitsLoaded / duration).toFixed(2); var speedKbps = (speedBps / 1024).toFixed(2); var speedMbps = (speedKbps / 1024).toFixed(2); testConnectionSpeed.callback(speedMbps); }, MeasureConnectionSpeed: function() { var download = new Image(); download.onload = function() { endTime = (new Date()).getTime(); testConnectionSpeed.result(); }; startTime = (new Date()).getTime(); var cacheBuster = '?nnn=' + startTime; download.src = testConnectionSpeed.imageAddr + cacheBuster; }, }; function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } const imageAddr = 'https://upload.wikimedia.org/wikipedia/commons/a/a6/Brandenburger_Tor_abends.jpg'; const downloadSize = 2707459; // this must match with the image above let startTime, endTime; function measureConnectionSpeed() { startTime = (new Date()).getTime(); var cacheBuster = '?nnn=' + startTime; var download = new Image(); download.src = imageAddr + cacheBuster; download.onload = function() { endTime = (new Date()).getTime(); var duration = (endTime - startTime) / 1000; var bitsLoaded = downloadSize * 8; var speedBps = (bitsLoaded / duration).toFixed(2); var speedKbps = (speedBps / 1024).toFixed(2); var speedMbps = (speedKbps / 1024).toFixed(2); console.log(speedMbps); return new Promise(resolve => resolve(speedMbps)); // return speedMbps; }; } async function getDownloadSpeed() { await timeout(1); const downloadSpeed = await measureConnectionSpeed(); console.log(downloadSpeed); } // start test immediatly, you could also call this on any event or whenever you want // testConnectionSpeed.getConnectionSpeed(function(time) { console.log(time) }); module.exports = testConnectionSpeed.getConnectionSpeed;