feat: separate solver logic into dedicated web worker, improve toast notifications
All checks were successful
Deploy to Production / deploy (push) Successful in 21s

This commit is contained in:
2026-02-24 09:56:16 +00:00
parent dc95b07188
commit 8a20531fa0
8 changed files with 263 additions and 75 deletions

View File

@@ -0,0 +1,58 @@
import { DeepCube } from "../utils/DeepCube.js";
import { KociembaSolver } from "../utils/solvers/KociembaSolver.js";
import { BeginnerSolver } from "../utils/solvers/BeginnerSolver.js";
let isKociembaReady = false;
// Defer heavy initialization to allow the worker to be responsive initially
setTimeout(() => {
console.log("[SolverWorker] Kociemba solver initialization");
console.time("[SolverWorker] Kociemba solver initialization");
KociembaSolver.init();
console.timeEnd("[SolverWorker] Kociemba solver initialization");
isKociembaReady = true;
postMessage({ type: "INIT_DONE" });
}, 50);
self.onmessage = (e) => {
const { type, payload } = e.data;
if (type === "SOLVE") {
const { solverType, cubeState } = payload;
if (solverType === "kociemba" && !isKociembaReady) {
postMessage({ type: "SOLVE_ERROR", payload: "wait for initialize solver" });
return;
}
try {
// Reconstruct DeepCube state from payload
const dc = new DeepCube(
new Int8Array(cubeState.cp),
new Int8Array(cubeState.co),
new Int8Array(cubeState.ep),
new Int8Array(cubeState.eo)
);
let solution = [];
if (solverType === "kociemba") {
const solver = new KociembaSolver(dc);
solution = solver.solve();
} else if (solverType === "beginner") {
const solver = new BeginnerSolver(dc);
solution = solver.solve();
} else {
throw new Error(`Unknown solver type: ${solverType}`);
}
postMessage({
type: "SOLVE_RESULT",
payload: solution,
});
} catch (err) {
console.error("[SolverWorker] Solve error:", err);
postMessage({ type: "SOLVE_ERROR", payload: err.message });
postMessage({ type: "SOLVE_RESULT", payload: [] });
}
}
};