let paused = false;
let autoStart = true;
let workers = [];
let totalTime = 0;
let startedAt;
let totalAttempts = 0;
let names = [];
fetch("names.json").then(res => res.json()).then(json => names = json);
function showStats() {
const time = totalTime + (Date.now() - startedAt);
document.getElementById("attempts").innerText = totalAttempts;
document.getElementById("speed").innerText = (totalAttempts / time).toFixed(2);
}
function log(text, workerId) {
const time = new Date().toLocaleTimeString("en-GB");
let html = ` `;
if (workerId) html += `[${workerId}] `;
html += `${text}
`;
document.getElementById("log").innerHTML += html;
document.getElementById("log").scrollTo(0, document.getElementById("log").scrollHeight);
}
function resetWorkers() {
log("Terminating workers");
for (const worker of workers) {
worker.postMessage({ type: "terminate" });
}
totalTime = 0;
totalAttempts = 0;
}
function runWorkers() {
const numbers = [].map.call(document.getElementsByClassName("number-input"), input => input.valueAsNumber)
.filter(value => !isNaN(value));
if (numbers.length < 4) return;
if (paused && !autoStart) return;
setPaused(false);
startedAt = Date.now();
const selectedWinType = document.querySelector("input[name=win-type]:checked");
const winType = selectedWinType.value;
const winTypeLabel = selectedWinType.parentElement.innerText.trim();
resetWorkers();
const amount = document.getElementById("workers").valueAsNumber;
const batchSize = document.getElementById("batch-size").valueAsNumber;
log(`Creating ${amount} workers`);
log(`* Win type: ${winType}`);
log(`* Numbers: ${numbers.join(", ")}`);
const usedNames = [];
for (let i = 0; i < amount; i++) {
let name;
do
name = names[Math.floor(Math.random() * names.length)];
while (usedNames.includes(name));
usedNames.push(name);
const worker = new Worker("worker.js");
worker.addEventListener("message", message => {
switch (message.data.type) {
case "ready":
if (!paused) worker.postMessage({ type: "run" });
break;
case "stats":
totalAttempts += message.data.attempts;
showStats();
break;
case "log":
log(message.data.text, message.data.id);
break;
case "winner":
document.getElementById("result-list").innerHTML +=
`