Add usimp.chooseDomainServer

This commit is contained in:
2021-05-09 21:24:42 +02:00
parent 0dd6fcbf5e
commit 86c328b33f
2 changed files with 46 additions and 10 deletions

View File

@ -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;

View File

@ -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(``)
}