use multiple workers for PoW

This commit is contained in:
creeper123123321 2021-05-24 17:46:50 -03:00
parent 72d82eaad3
commit 2aaf52c520
4 changed files with 63 additions and 22 deletions

View File

@ -35,9 +35,6 @@ script-src 'self' https://*.cloudflare.com/ https://alcdn.msauth.net/ https://*.
<script crossorigin="anonymous"
integrity="sha512-UNM1njAgOFUa74Z0bADwAq8gbTcqZC8Ej4xPSzpnh0l6KMevwvkBvbldF9uR++qKeJ+MOZHRjV1HZjoRvjDfNQ=="
src="https://cdnjs.cloudflare.com/ajax/libs/uuid/8.3.2/uuid.min.js"></script>
<script crossorigin="anonymous"
integrity="sha512-/yIGjYJZIXZx10ig0yhbK41OiwcqBUxIj0xQJe+NwkMIdS/u07b6Mwo0nvXB4o7A6WiKnKOf92JwE5Ezo27u9Q=="
src="https://cdnjs.cloudflare.com/ajax/libs/jsSHA/3.2.0/sha.min.js"></script>
<script src="https://alcdn.msauth.net/browser/2.14.2/js/msal-browser.min.js"
integrity="sha384-ggh+EF1aSqm+Y4yvv2n17KpurNcZTeYtUZUvhPziElsstmIEubyEB6AIVpKLuZgr"
crossorigin="anonymous"></script>

View File

@ -4,6 +4,7 @@ var listening = document.getElementById("listening");
var actions = document.getElementById("actions");
var accounts = document.getElementById("accounts-list");
var listenVisible = false;
var workers = new Array(navigator.hardwareConcurrency).fill(null).map(() => new Worker("js/worker.js"));
// On load
$(() => {
@ -20,10 +21,9 @@ $(() => {
$("#form_ws_url").on("submit", e => setWsUrl($("#ws-url").val()));
$("#form_cors_proxy").on("submit", e => setCorsProxy($("#cors-proxy").val()));
workers.forEach(it => it.onmessage = onWorkerMsg);
refreshAccountList();
// Heroku sleeps in 30 minutes, let's call it every 10 minutes to keep the same address, so Mojang see it as less suspect
setInterval(refreshCorsStatus, 10 * 60 * 1000);
setInterval(refreshCorsStatus, 10 * 60 * 1000); // Heroku auto sleeps in 30 min
refreshCorsStatus();
resetHtml();
@ -99,20 +99,23 @@ function renderActions() {
addAction("Listen to offline login in VIAaaS instance", () => {
let user = prompt("Offline username (case-sensitive):", "");
if (!user) return;
let msg = null;
do {
msg = JSON.stringify({
action: "offline_login",
username: user,
date: Date.now(),
rand: Math.random()
});
} while (!sha512(msg).startsWith("00000"));
socket.send(msg);
workers.forEach(it => it.postMessage({action: "listen_pow", user: user, id: Math.random()}));
addToast("Offline username", "Please wait a minute...");
});
}
}
function onWorkerMsg(e) {
console.log(e);
if (e.data.action == "completed_pow") onCompletedPoW(e);
}
function onCompletedPoW(e) {
addToast("Offline username", "Completed proof of work");
workers.forEach(it => it.postMessage({action: "cancel", id: e.data.id}));
socket.send(e.data.msg);
}
function addAction(text, onClick) {
let p = document.createElement("p");
let link = document.createElement("a");

View File

@ -15,9 +15,3 @@ function icanhazip(cors) {
.then(r => r.text())
.then(it => it.trim());
}
function sha512(s) {
const shaObj = new jsSHA("SHA-512", "TEXT", { encoding: "UTF8" });
shaObj.update(s);
return shaObj.getHash("HEX");
}

View File

@ -0,0 +1,47 @@
importScripts("https://cdnjs.cloudflare.com/ajax/libs/jsSHA/3.2.0/sha.min.js");
var pending = [];
onmessage = function(e) {
if (e.data.action == "listen_pow") startPoW(e);
if (e.data.action == "cancel") removePending(e.data.id);
}
function removePending(id) {
console.log("removing task" + id);
pending = pending.filter(it => it != id);
}
function startPoW(e) {
pending.push(e.data.id);
listenPoW(e);
}
function listenPoW(e) {
var user = e.data.user;
let msg = null;
var endTime = Date.now() + 1000;
do {
if (!pending.includes(e.data.id)) return; // cancelled
msg = JSON.stringify({
action: "offline_login",
username: user,
date: Date.now(),
rand: Math.random()
});
if (Date.now() >= endTime) {
setTimeout(() => listenPoW(e), 1);
return;
}
} while (!sha512(msg).startsWith("00000"));
postMessage({id: e.data.id, action: "completed_pow", msg: msg});
}
function sha512(s) {
const shaObj = new jsSHA("SHA-512", "TEXT", { encoding: "UTF8" });
shaObj.update(s);
return shaObj.getHash("HEX");
}