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.
2.6 KiB
Сессия 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 ограничена троттлингом. Живую проверку делает пользователь.