v1.10.0 — гонки записи, XSS, модульность
Бэкенд
- Гонка записи устранена: все циклы load→modify→save (
layout/set|update|delete,
config/set) сериализованы общимasyncio.Lock— параллельные WS-вызовы больше не теряют
изменения, проверкаexpected_revстала атомарной. - Новая WS-команда
houseplan/layout/delete— чистка позиции при удалении маркера
(раньше в.storage/houseplan.layoutкопились сироты). - Удалена мёртвая WS-команда
houseplan/file/set— файлы грузятся только по HTTP
(/api/houseplan/upload), как и было в карточке. - HTTP-загрузка: лимит 25 МБ применяется ПО МЕРЕ чтения multipart (обрыв на лимите),
а не после чтения всего файла в память;stat()файлов ушёл в executor. request.app[KEY_HASS]вместо устаревшегоrequest.app["hass"](с фолбэком для старых HA).
Фронтенд
- God-component разобран:
houseplan-card.ts3023 → ~1990 строк.
Стили →styles.ts; типы →types.ts; построение устройств из реестров HA
(курирование, группы света, маркеры, LQI/температура) →devices.ts(чистые функции). - Last-writer-wins в раскладке устранён:
_saveMarkerпишет позицию точечно
(layout/update), а не всей раскладкой (layout/set) — не затирает позиции из других
окон (регресс-класс инцидента v1.4.4). Перепривязка/удаление подчищают старую позицию. - XSS закрыт:
linkиpdfs[].urlмаркеров проходятsafeUrl()(только http(s)
и относительные пути;javascript:/data:отбрасываются). +12 тестов. - Загрузка файлов через
hass.fetchWithAuth(автообновление протухшего токена),
фолбэк на сырой токен. - Хардкод дачи убран из GUI-редактора: список «пространство по умолчанию» строится
из серверного конфига (WSconfig/get), а не зашитых f1/f2/yard. rules.ts: удалён мёртвый экспортGROUP_TITLES; регэкспыiconForпрекомпилированы.- Единый
_errText()во всех обработчиках ошибок (никогда «[object Object]»).