Hello,
I modified my function to add a throttling mechanism and a retry queue for WMS tiles.
Everything works correctly in development mode, but fails in production mode.
After investigating, I found that in production constructor.name is minified, so class names like TileLayer and TileWMS are replaced by minified identifiers.
What is the recommended way to detect a TileLayer with a TileWMS source in production mode? Thank you!
private fun applyWMSTileRetry(map: GeoMap, layerDelays: String): PendingJavaScriptResult? = map.element.executeJs(
“”"
setTimeout(() => {
const layers = this.olMap.getLayers().getArray();
layers.forEach(layer => {
const source = layer.getSource();
if (layer.constructor.name === ‘TileLayer’ && source && source.constructor.name === ‘TileWMS’) {
source.refresh();
// File d’attente pour les tuiles
const pendingCalls = [];
let isProcessing = false;
let lastCallTime = 0;
const layerUrl = source.getUrls()[0];
const layerDelays = JSON.parse($0);
const DELAY = layerDelays[layerUrl] || 0;
const MAX_RETRIES = 10;
async function processQueue() {
if (isProcessing || pendingCalls.length === 0) return;
isProcessing = true;
while (pendingCalls.length > 0) {
const now = performance.now();
const timeSinceLastCall = now - lastCallTime;
if (timeSinceLastCall < DELAY) {
await new Promise(resolve => setTimeout(resolve, DELAY - timeSinceLastCall));
}
lastCallTime = performance.now();
const item = pendingCalls.shift();
// Charger la tuile avec retry
const success = await loadTile(item.tile, item.src);
if (!success && item.retryCount < MAX_RETRIES) {
item.retryCount++;
pendingCalls.push(item);
}
}
isProcessing = false;
}
async function loadTile(tile, src) {
const image = tile.getImage();
try {
const resp = await fetch(src);
if (resp.ok) {
const blob = await resp.blob();
const url = URL.createObjectURL(blob);
image.src = url;
image.onload = () => {
setTimeout(() => URL.revokeObjectURL(url), 5000);
};
image.onerror = () => {
URL.revokeObjectURL(url);
};
return true; // Succès
} else {
console.log(`Failed to load tile: ${'$'}{src}, status: ${'$'}{resp.status}`);
return false; echec - réessayé
}
} catch (error) {
console.log("Error loading tile:", error);
return false; // echec - réessayé
}
}
source.setTileLoadFunction((tile, src) => {
pendingCalls.push({ tile, src, retryCount: 0 });
processQueue(); // Continuer à traiter la file d'attente
});
}
});
}, 0);
""", layerDelays
)