[webapp] Optimise le chargement des snapshots renderers avec batch controlé

- Ajoute la fonction fetchBatchSnapshots pour limiter le nombre de requêtes simultanées (concurrency=3) et évite la saturation réseau avec un délai entre les batches
- Remplace le chargement séquentiel des snapshots par une approche batchée dans DashboardView.vue
- Introduit un état de chargement (isLoadingSnapshots) et une indiqueur visuel avec Loader2 animé
- Charge les renderers/servers en parallèle au montage via Promise.all
This commit is contained in:
2026-04-03 22:32:02 +02:00
parent 037ddc99ee
commit 0cb3cbe470
2 changed files with 90 additions and 8 deletions

View File

@@ -345,6 +345,46 @@ async function fetchRendererSnapshot(
}
}
/**
* Fetch les snapshots de plusieurs renderers en parallèle controlée.
* - Limite le nombre de requêtes simultanées (concurrency)
* - Ajoute un délai entre chaque batch pour ne pas saturer le réseau
* - Continue même si certaines requêtes échouent
*/
async function fetchBatchSnapshots(
rendererIds: string[],
options: {
concurrency?: number; // Nombre max de requêtes parallèles (défaut: 3)
batchDelay?: number; // Délai entre les batches en ms (défaut: 100ms)
force?: boolean; // Forcer le refetch même en cache
} = {}
): Promise<void> {
const { concurrency = 3, batchDelay = 100, force = false } = options;
// Filtrer les rendererIds valides
const validIds = rendererIds.filter(id => id && typeof id === 'string');
if (validIds.length === 0) return;
// Fonction pour traiter un batch
const processBatch = async (batch: string[]): Promise<void> => {
await Promise.allSettled(
batch.map(id => fetchRendererSnapshot(id, { force }))
);
};
// Exécuter par batches avec controlled concurrency
for (let i = 0; i < validIds.length; i += concurrency) {
const batch = validIds.slice(i, i + concurrency);
await processBatch(batch);
// Délai entre les batches (sauf pour le dernier)
if (i + concurrency < validIds.length) {
await new Promise(resolve => setTimeout(resolve, batchDelay));
}
}
}
// Transport controls
async function play(id: string) {
await api.play(id);
@@ -477,6 +517,7 @@ export function useRenderers() {
// Fetchers
fetchRenderers,
fetchRendererSnapshot,
fetchBatchSnapshots,
// Transport controls
play,
resumeOrPlayFromQueue,