Tiles: heal blank tiles online (periodic OSM-reachability check + backfill)

The on-demand loader never retries a tile whose fetch failed, so holes from a
bad signal stayed blank even after the network recovered. Add a healer: every
30s, when OSM is reachable, re-fetch MISSING tiles (current zoom) for the
visible area and along the ridden route, cache them, and redraw. Gentle to OSM
(one-tile probe, 300ms throttle, <=40 fetches/cycle); respects offline mode.
Wired on record/detail/compare/roads maps, stopped on screen change.
This commit is contained in:
4aiman 2026-10-19 20:07:05 +03:00
commit 3f092cced0
5 changed files with 148 additions and 6 deletions

View file

@ -0,0 +1,27 @@
# Сессия 2026-10-19 (доб.) - онлайн-долечивание пустых тайлов
## Причина (из диагностики ранее)
`createTile` (tilecache.js) при падении фетча не ретраит: Leaflet метит тайл
loaded-with-error и не перезапрашивает, пока тайл не пересоздан (панорама/зум/redraw/
новая карта). Поэтому дырки от плохого сигнала в поездке висели даже после возврата связи
(подтверждено: офлайн ВЫКЛ, OSM через VPN отдавал 200, но пустые тайлы не оживали).
## Сделано (фича по запросу пользователя)
tilecache.js - хилер:
- `probeOsm()` - navigator.onLine + один тайл 0/0/0.png (таймаут 6с) = OSM доступен.
- `startHealer(map, layer, pointsFn)` / `stopHealer()` - раз в 30с, если онлайн и не
offline-режим: собирает недостающие тайлы на ТЕКУЩЕМ зуме по видимой области + (если
pointsFn есть) вдоль маршрута (rotating cursor по длинному треку, чтобы не бурстить),
фетчит с OSM, кэширует, по заполнению `layer.redraw()`. Лимиты: троттл 300мс, ≤40
фетчей/цикл, ≤500 lookups/цикл - бережно к политике OSM (без массовой скачки).
Также немедленный проход по событию `online` и через 3с после открытия карты.
- Решения пользователя: зум - только текущий; охват - запись + просмотр.
main.js - подключение: хилер стартует на картах записи (pointsFn = точки текущей записи),
детали трека (точки трека), сравнения треков и экрана "Дороги" (оба - по видимой области,
pointsFn=null); глушится в `renderScreen` при уходе с экрана (и на map 'unload').
## Проверка
Синтаксис JS ок (tilecache.js, main.js). На телефоне: открыть трек с дырявыми тайлами при
живой сети - в течение ~30с дырки на текущем зуме заполняются; при офлайн-режиме докачки нет;
нагрузка на OSM ограничена троттлингом. Живую проверку делает пользователь.