Implemented the new provider system into the speedtest.js task

This commit is contained in:
Mathias Wagner
2024-05-19 15:33:06 +02:00
parent 87c8bb0aee
commit e724f1dac4

View File

@@ -2,14 +2,12 @@ const speedTest = require('../util/speedtest');
const tests = require('../controller/speedtests');
const config = require('../controller/config');
const controller = require("../controller/recommendations");
const parseData = require('../util/providers/parseData');
let {setState, sendRunning, sendError, sendFinished} = require("./integrations");
const serverController = require("../controller/servers");
let isRunning = false;
const roundSpeed = (bytes, elapsed) => {
return Math.round((bytes * 8 / elapsed) / 10) / 100;
}
const setRunning = (running, sendRequest = true) => {
isRunning = running;
@@ -35,25 +33,69 @@ const createRecommendations = async () => {
}
}
module.exports.executeCloudflare = async () => {
try {
const {default: SpeedTest} = await import('@cloudflare/speedtest');
// This needs to be disabled because of a library issue
// See https://github.com/cloudflare/speedtest/issues/17
console.warn = () => {};
const startTime = new Date().getTime();
return await new Promise(resolve => {
const speedTest = new SpeedTest();
speedTest.onFinish = results => {
resolve({...results.getSummary(), elapsed: new Date().getTime() - startTime});
}
});
} catch (error) {
console.error('Error loading SpeedTest module:', error);
}
}
module.exports.run = async (retryAuto = false) => {
setRunning(true);
let serverId = await config.getValue("serverId");
let mode = await config.getValue("provider");
if (mode === "none") {
setRunning(false);
throw {message: "No provider selected"};
}
let serverId = mode === "cloudflare" ? 0 : await config.getValue(mode + "Id");
if (serverId === "none")
serverId = undefined;
let speedtest = await (retryAuto ? speedTest() : speedTest(serverId));
let speedtest;
if (mode === "cloudflare") {
speedtest = await this.executeCloudflare();
} else {
speedtest = await (retryAuto ? speedTest(mode) : speedTest(mode, serverId));
}
if (serverId === undefined)
await config.updateValue("serverId", speedtest.server.id);
if (serverId === undefined && mode === "ookla") {
serverId = speedtest.server.id;
await config.updateValue("ooklaId", speedtest.server.id);
}
if (serverId === undefined && mode === "libre") {
let server = Object.entries(serverController.getLibreServers())
.filter(([key, value]) => value === speedtest.server.name)[0][0];
serverId = parseInt(server);
if (server) await config.updateValue("libreId", server);
}
if (Object.keys(speedtest).length === 0) throw {message: "No response, even after trying again, test timed out."};
return speedtest;
return {...speedtest, serverId}
}
module.exports.create = async (type = "auto", retried = false) => {
if (await config.getValue("acceptOoklaLicense") === 'false') return;
const mode = await config.getValue("provider");
if (mode === "none") return 400;
if (isRunning && !retried) return 500;
try {
@@ -69,18 +111,16 @@ module.exports.create = async (type = "auto", retried = false) => {
test = await this.run(retried);
}
let ping = Math.round(test.ping.latency);
let download = roundSpeed(test.download.bytes, test.download.elapsed);
let upload = roundSpeed(test.upload.bytes, test.upload.elapsed);
let time = Math.round((test.download.elapsed + test.upload.elapsed) / 1000);
let testResult = await tests.create(ping, download, upload, time, type);
let {ping, download, upload, time} = await parseData.parseData(mode, test);
let testResult = await tests.create(ping, download, upload, time, test.serverId, type);
console.log(`Test #${testResult} was executed successfully in ${time}s. 🏓 ${ping}${download}${upload}`);
createRecommendations().then(() => "");
setRunning(false);
sendFinished({ping, download, upload, time}).then(() => "");
} catch (e) {
if (!retried) return this.create(type, true);
let testResult = await tests.create(-1, -1, -1, null, type, e.message);
let testResult = await tests.create(-1, -1, -1, null, 0, type, e.message);
await sendError(e.message);
setRunning(false, false);
console.log(`Test #${testResult} was not executed successfully. Please try reconnecting to the internet or restarting the software: ` + e.message);