feat: separate solver logic into dedicated web worker, improve toast notifications
All checks were successful
Deploy to Production / deploy (push) Successful in 21s
All checks were successful
Deploy to Production / deploy (push) Successful in 21s
This commit is contained in:
58
src/workers/Solver.worker.js
Normal file
58
src/workers/Solver.worker.js
Normal 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: [] });
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user