From c187b7a39516ebfc34285a9046edf134fb71d419 Mon Sep 17 00:00:00 2001 From: haunter Date: Thu, 24 Jul 2025 13:09:51 +0200 Subject: [PATCH] Initial commit: migrated from GitHub --- Dockerfile | 20 ++++++++++++++++++++ docker-compose.yml | 14 ++++++++++++++ src/lib/engine/shared.ts | 27 +++++++++++++++++++-------- src/lib/engine/worker.ts | 23 ++++++++++++++--------- src/sections/analysis/states.ts | 8 ++++++-- 5 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..290b449 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# Use Node LTS image +FROM node:18-alpine + +# Set working directory +WORKDIR /app + +# Copy dependency files +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy the rest of the app +COPY . . + +# Expose development port +EXPOSE 3000 + +# Start the dev server +CMD ["npm", "run", "dev"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3b154da --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.8' + +services: + chesskit: + build: . + ports: + - "3100:3000" + volumes: + - .:/app + - /app/node_modules # Prevent overwriting node_modules + environment: + - NODE_ENV=development + stdin_open: true + tty: true diff --git a/src/lib/engine/shared.ts b/src/lib/engine/shared.ts index 328366a..e410400 100644 --- a/src/lib/engine/shared.ts +++ b/src/lib/engine/shared.ts @@ -4,25 +4,34 @@ import { Stockfish16 } from "./stockfish16"; import { Stockfish16_1 } from "./stockfish16_1"; import { Stockfish17 } from "./stockfish17"; -export const isWasmSupported = () => +export const isWasmSupported = (): boolean => typeof WebAssembly === "object" && WebAssembly.validate( Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00) ); -export const isMultiThreadSupported = () => { +export const isIosDevice = (): boolean => { + if (typeof navigator !== "undefined") { + return /iPhone|iPad|iPod/i.test(navigator.userAgent); + } + return false; +}; + +export const isMobileDevice = (): boolean => { + if (typeof navigator !== "undefined") { + return isIosDevice() || /Android|Opera Mini/i.test(navigator.userAgent); + } + return false; +}; + +export const isMultiThreadSupported = (): boolean => { try { - return SharedArrayBuffer !== undefined && !isIosDevice(); + return typeof SharedArrayBuffer !== "undefined" && !isIosDevice(); } catch { return false; } }; -export const isIosDevice = () => /iPhone|iPad|iPod/i.test(navigator.userAgent); - -export const isMobileDevice = () => - isIosDevice() || /Android|Opera Mini/i.test(navigator.userAgent); - export const isEngineSupported = (name: EngineName): boolean => { switch (name) { case EngineName.Stockfish17: @@ -36,5 +45,7 @@ export const isEngineSupported = (name: EngineName): boolean => { return Stockfish16.isSupported(); case EngineName.Stockfish11: return Stockfish11.isSupported(); + default: + return false; } }; diff --git a/src/lib/engine/worker.ts b/src/lib/engine/worker.ts index 224e0d9..703ebb3 100644 --- a/src/lib/engine/worker.ts +++ b/src/lib/engine/worker.ts @@ -45,16 +45,21 @@ export const sendCommandsToWorker = ( }; export const getRecommendedWorkersNb = (): number => { - const maxWorkersNbFromThreads = Math.max( - 1, - Math.round(navigator.hardwareConcurrency - 4), - Math.floor((navigator.hardwareConcurrency * 2) / 3) - ); + let maxWorkersNbFromThreads = 4; + let maxWorkersNbFromMemory = 4; - const maxWorkersNbFromMemory = - "deviceMemory" in navigator && typeof navigator.deviceMemory === "number" - ? Math.max(1, Math.round(navigator.deviceMemory)) - : 4; + if (typeof navigator !== "undefined") { + maxWorkersNbFromThreads = Math.max( + 1, + Math.round(navigator.hardwareConcurrency - 4), + Math.floor((navigator.hardwareConcurrency * 2) / 3) + ); + + maxWorkersNbFromMemory = + "deviceMemory" in navigator && typeof navigator.deviceMemory === "number" + ? Math.max(1, Math.round(navigator.deviceMemory)) + : 4; + } const maxWorkersNbFromDevice = isIosDevice() ? 2 : isMobileDevice() ? 4 : 8; diff --git a/src/sections/analysis/states.ts b/src/sections/analysis/states.ts index a294bdf..658b029 100644 --- a/src/sections/analysis/states.ts +++ b/src/sections/analysis/states.ts @@ -1,11 +1,12 @@ import { DEFAULT_ENGINE } from "@/constants"; -import { getRecommendedWorkersNb } from "@/lib/engine/worker"; +import { getRecommendedWorkersNb } from "@/lib/engine/worker"; // ✅ Already includes navigator guards import { EngineName } from "@/types/enums"; import { CurrentPosition, GameEval, SavedEvals } from "@/types/eval"; import { Chess } from "chess.js"; import { atom } from "jotai"; import { atomWithStorage } from "jotai/utils"; +// ✅ Core atoms for game state and UI export const gameEvalAtom = atom(undefined); export const gameAtom = atom(new Chess()); export const boardAtom = atom(new Chess()); @@ -15,13 +16,16 @@ export const boardOrientationAtom = atom(true); export const showBestMoveArrowAtom = atom(true); export const showPlayerMoveIconAtom = atom(true); +// ✅ Engine config atoms export const engineNameAtom = atom(DEFAULT_ENGINE); export const engineDepthAtom = atom(14); export const engineMultiPvAtom = atom(3); + +// ✅ This line is now safe thanks to navigator guards in the function export const engineWorkersNbAtom = atomWithStorage( "engineWorkersNb", getRecommendedWorkersNb() ); -export const evaluationProgressAtom = atom(0); +export const evaluationProgressAtom = atom(0); export const savedEvalsAtom = atom({});