From 86c328b33f3d6494036bfc9fcc789739b825c604 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sun, 9 May 2021 21:24:42 +0200 Subject: [PATCH] Add usimp.chooseDomainServer --- www/res/js/locutus.js | 28 ++++++++++++++++++---------- www/res/js/usimp.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/www/res/js/locutus.js b/www/res/js/locutus.js index 0146880..8e0cb01 100644 --- a/www/res/js/locutus.js +++ b/www/res/js/locutus.js @@ -37,26 +37,34 @@ function createLoginWindow() { form.removeChild(d); } + function formError(msg) { + let div = document.createElement("div"); + div.classList.add("error"); + div.innerText = msg; + form.appendChild(div); + } + usimp.lookup(form.domain.value) .then(res => { if (res.ok) { res.json() - .then(data => console.log(data)) - .catch(reason => console.error(reason)) + .then(data => { + console.log(data["domain"]); + let domainServer = usimp.chooseDomainServer(data["domain_servers"]); + console.log(domainServer); + }) + .catch(reason => { + console.error(reason); + formError("Could not communicate with USIMP domain"); + }) } else { document.getElementsByName("domain")[0].setAttribute("invalid", "invalid"); - let div = document.createElement("div"); - div.classList.add("error"); - div.innerText = "Invalid USIMP domain"; - form.appendChild(div); + formError("Invalid USIMP domain"); } }) .catch(reason => { document.getElementsByName("domain")[0].setAttribute("invalid", "invalid"); - let div = document.createElement("div"); - div.classList.add("error"); - div.innerText = "Invalid USIMP domain"; - form.appendChild(div); + formError("Invalid USIMP domain"); }) .finally(() => { for (let e of form) e.disabled = false; diff --git a/www/res/js/usimp.js b/www/res/js/usimp.js index 079c6ef..960e787 100644 --- a/www/res/js/usimp.js +++ b/www/res/js/usimp.js @@ -7,3 +7,31 @@ usimp.lookup = function (domain_name) { redirect: "manual", }); } + +usimp.chooseDomainServer = function (domainServers, invalidDomainServers = []) { + if (domainServers.length === 0) throw Error("No domain servers specified"); + + domainServers.filter(srv => invalidDomainServers.map(srv => srv.host).includes(srv)); + if (domainServers.length === 0) throw Error("No domain servers reachable"); + if (domainServers.length === 1) return domainServers[0]; + + let priority = domainServers.reduce((min, srv) => Math.min(min, srv.priority), Infinity); + domainServers = domainServers.filter(srv => srv.priority === priority); + if (domainServers.length === 1) return domainServers[0]; + + let totalWeight = domainServers.reduce((total, srv) => total + srv.weight, 0); + let w = Math.floor(Math.random() * totalWeight); + + let accumulator = 0; + for (let srv of domainServers) { + accumulator += srv.weight; + if (w < accumulator) return srv; + } + + console.warn("Domain server selection not worked correctly"); + return domainServers[0]; +} + +usimp.login = function (domainServer, accountName, password) { + return fetch(``) +}