fix(offline): cache osm-de and stadia tiles, prefetch down to the opening zoom (#2180)

This commit is contained in:
Maurice
2026-09-01 17:45:08 +02:00
committed by Maurice
parent 1e6f1fe95c
commit 5decdcfa13
5 changed files with 78 additions and 6 deletions
+4 -1
View File
@@ -20,7 +20,10 @@ import type { Place } from '../types'
/** OpenFreeMap serves vector tiles up to z14 and overzooms from there. */
const VECTOR_MAX_ZOOM = 14
const VECTOR_MIN_ZOOM = 10
// Zoom 0, not 10: MapLibre can only overzoom upward, so a wide trip opening at
// its fitBounds zoom (z6–9) rendered nothing offline with a z10 floor (#2180).
// The low zooms cost a few dozen tiles at most.
const VECTOR_MIN_ZOOM = 0
/** Requests in flight, kept low for the same reason the raster side keeps it low. */
const CONCURRENCY = 6
+6 -3
View File
@@ -4,7 +4,10 @@
*
* Algorithm:
* 1. Compute bbox from trip's place coordinates + padding.
* 2. For zooms 10–16, enumerate tile XYZ coordinates within bbox.
* 2. For zooms 0–16, enumerate tile XYZ coordinates within bbox. The low
* zooms cost next to nothing (a handful of tiles) but are what the trip
* map actually opens at for a multi-city bbox — a z10 floor left the
* fitBounds view empty offline (#2180).
* 3. Stop when cumulative tile estimate exceeds MAX_TILES (~50 MB).
* 4. Fetch each tile URL so the Service Worker CacheFirst handler caches it,
* at most TILE_CONCURRENCY at a time.
@@ -228,7 +231,7 @@ async function openTileCache(): Promise<Cache | null> {
export async function prefetchTiles(
bbox: TileBbox,
tileUrlTemplate: string,
minZoom = 10,
minZoom = 0,
maxZoom = 16,
cartoKey?: string,
): Promise<number> {
@@ -362,7 +365,7 @@ export async function prefetchTilesForTrip(
// tile providers that don't send CORS headers. To stop the browser evicting
// these tiles under the inflated quota, we request persistent storage at app
// init instead (sync/persistentStorage.ts).
const fetched = await prefetchTiles(bbox, template, 10, 16, cartoKey)
const fetched = await prefetchTiles(bbox, template, 0, 16, cartoKey)
// Update syncMeta with bbox and tile count
const meta = await offlineDb.syncMeta.get(tripId)