From 975477332461b239da7c103ff2f8fc997e2ce1e1 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 16:02:30 +0300 Subject: [PATCH] =?UTF-8?q?fix(lab-content-engine):=20=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D1=83=D0=B7=D0=B5=D1=80=D0=BD=D1=8B=D0=B5=20=D0=B1=D0=B0=D0=B3?= =?UTF-8?q?=D0=B8=20=D0=A4=D0=B0=D0=B7=203-4=20+=20=D1=87=D0=B8=D0=BD?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=BB=D0=BE=D0=BC=D0=B0=D0=BD=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. cirSim ReferenceError в _pauseAllSims/closeSim (регрессия Фазы 3): глобалы экземпляров симуляций объявлены в ленивых файлах -> не существуют до открытия. Предсоздаём их как window-свойства (null) -> guard'ы безопасны. (lab-init.js) 2. theory-data.js (вынос THEORY параллельной сессией) не подключался в lab.html -> панель теории и fallback loadTheory ломались. Добавил перед _register-all. 3. _pilots.js удалён в Фазе 1, но lab.html ссылался -> 404. Убрал ссылку. 4. /api/lab/sims 500 на неотмигрированном/устаревшем инстансе -> деградация: возвращаем пустой каталог + needs_migration вместо 500. (routes/lab.js) Проверка: vm-доказательство (_pauseAllSims без throw), node --check всех файлов, lab-sims тесты 11/11. ВАЖНО: на работающем dev-сервере нужен ПЕРЕЗАПУСК (сервер не авто-мигрирует) — таблица lab_sims уже в live БД. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/routes/lab.js | 11 ++++++++++- frontend/js/labs/lab-init.js | 13 +++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/backend/src/routes/lab.js b/backend/src/routes/lab.js index 1cadd5b..55070c6 100644 --- a/backend/src/routes/lab.js +++ b/backend/src/routes/lab.js @@ -44,7 +44,16 @@ function rowToSim(r) { /* ── GET /api/lab/sims ─────────────────────────────────────────────────── */ router.get('/sims', (_req, res) => { - const rows = db.prepare(`SELECT * FROM lab_sims ORDER BY sort_order, id`).all(); + let rows; + try { + rows = db.prepare(`SELECT * FROM lab_sims ORDER BY sort_order, id`).all(); + } catch (e) { + // Деградация вместо 500: если миграция lab_sims ещё не применена на этом + // инстансе (старый процесс/другая БД) — отдаём пустой каталог, чтобы админка + // не падала. Нужно применить миграцию и перезапустить сервер. + console.warn('[lab] lab_sims недоступна (нужна миграция/перезапуск):', e.message); + return res.json({ module_disabled: readModuleDisabled(), sims: [], needs_migration: true }); + } const legacyDisabled = readLegacyDisabledIds(); const sims = rows.map(r => { const s = rowToSim(r); diff --git a/frontend/js/labs/lab-init.js b/frontend/js/labs/lab-init.js index d9eda90..3e9d5d1 100644 --- a/frontend/js/labs/lab-init.js +++ b/frontend/js/labs/lab-init.js @@ -30,6 +30,19 @@ var geomSim = null; var qualSim = null; + /* Контент-движок, Фаза 3 (ленивая загрузка): часть глобалов с экземплярами + симуляций объявляется внутри их собственных НЫНЕ ЛЕНИВЫХ файлов, поэтому до + первого открытия такой симуляции они не существуют. Legacy-«дробовик» + _pauseAllSims()/closeSim() ссылается на них по голому имени, что до загрузки + любого файла бросало ReferenceError (напр. cirSim). Предсоздаём эти имена как + свойства window (null), чтобы guard'ы безопасно давали false; при загрузке + файла симуляции его собственный var/присваивание обновит тот же глобал. */ + ['cirSim','reacSim','flaskSim','newtonSim','sandboxSim','crystalSim','orbitalsSim', + 'stereoSim','angryBirdsSim','trigSim','pendSim','radioactiveSim','heSim', + 'periodicSim','organicSim','_solutionsSim','mirrorSim'].forEach(function (_n) { + if (!(_n in window)) window[_n] = null; + }); + var ALL_SIM_BODIES = ['sim-graph','sim-proj','sim-coll','sim-tri','sim-trigcircle','sim-emfield', 'sim-molphys', 'sim-circuit','sim-chemistry','sim-dynamics',