lot of changes, got rid of custom cache stuff, now stepping in the way of http fetch instead of screwing with flutter map.

This commit is contained in:
stopflock
2025-08-23 17:42:53 -05:00
parent a2bc3309c0
commit a21e807d88
8 changed files with 164 additions and 216 deletions
@@ -9,15 +9,10 @@ import '../network_status.dart';
/// Global semaphore to limit simultaneous tile fetches
final _tileFetchSemaphore = _SimpleSemaphore(4); // Max 4 concurrent
/// Cancellation token to invalidate all pending requests
int _globalCancelToken = 0;
/// Clear queued tile requests and cancel all retries
/// Clear queued tile requests when map view changes significantly
void clearOSMTileQueue() {
final oldToken = _globalCancelToken;
_globalCancelToken++; // Invalidate all pending requests and retries
final clearedCount = _tileFetchSemaphore.clearQueue();
debugPrint('[OSMTiles] Cancel token: $oldToken -> $_globalCancelToken, cleared $clearedCount queued');
debugPrint('[OSMTiles] Cleared $clearedCount queued tile requests');
}
/// Fetches a tile from OSM, with in-memory retries/backoff, and global concurrency limit.
@@ -37,17 +32,7 @@ Future<List<int>> fetchOSMTile({
kTileFetchThirdDelayMs + random.nextInt(kTileFetchJitter3Ms),
];
// Remember the cancel token when we start this request
final requestCancelToken = _globalCancelToken;
print('[fetchOSMTile] START $z/$x/$y with token $requestCancelToken (global: $_globalCancelToken)');
while (true) {
// Check if this request was cancelled
if (requestCancelToken != _globalCancelToken) {
print('[fetchOSMTile] CANCELLED $z/$x/$y (token: $requestCancelToken vs $_globalCancelToken)');
throw Exception('Tile request cancelled');
}
await _tileFetchSemaphore.acquire();
try {
print('[fetchOSMTile] FETCH $z/$x/$y');
@@ -55,12 +40,6 @@ Future<List<int>> fetchOSMTile({
final resp = await http.get(Uri.parse(url));
print('[fetchOSMTile] HTTP ${resp.statusCode} for $z/$x/$y, length=${resp.bodyBytes.length}');
// Check cancellation after HTTP request completes - this is the key check!
if (requestCancelToken != _globalCancelToken) {
print('[fetchOSMTile] CANCELLED $z/$x/$y after HTTP (token: $requestCancelToken vs $_globalCancelToken)');
throw Exception('Tile request cancelled');
}
if (resp.statusCode == 200 && resp.bodyBytes.isNotEmpty) {
print('[fetchOSMTile] SUCCESS $z/$x/$y');
NetworkStatus.instance.reportOsmTileSuccess();
@@ -71,11 +50,6 @@ Future<List<int>> fetchOSMTile({
throw HttpException('Failed to fetch tile $z/$x/$y: status ${resp.statusCode}');
}
} catch (e) {
// Don't retry cancelled requests
if (e.toString().contains('cancelled')) {
rethrow;
}
print('[fetchOSMTile] Exception $z/$x/$y: $e');
// Report network issues on connection errors
@@ -92,19 +66,7 @@ Future<List<int>> fetchOSMTile({
final delay = delays[attempt - 1].clamp(0, 60000);
print("[fetchOSMTile] Attempt $attempt for $z/$x/$y failed: $e. Retrying in ${delay}ms.");
// Check cancellation before and after delay
if (requestCancelToken != _globalCancelToken) {
print('[fetchOSMTile] CANCELLED $z/$x/$y before retry');
throw Exception('Tile request cancelled');
}
await Future.delayed(Duration(milliseconds: delay));
if (requestCancelToken != _globalCancelToken) {
print('[fetchOSMTile] CANCELLED $z/$x/$y after retry delay');
throw Exception('Tile request cancelled');
}
} finally {
_tileFetchSemaphore.release();
}