[webapp] Add retry logic and improve renderer registration
- Added automatic retries with exponential backoff to fetchRenderers - Improved WebRenderer registration: handle stale players, avoid duplicate registrations, and force renderers refresh after successful connection - Bumped version to v0.3.37 (Cargo: 0.3.36 → Cargo.lock mismatch fixed by updating to final version)
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -4,7 +4,7 @@ version = 4
|
||||
|
||||
[[package]]
|
||||
name = "PMOMusic"
|
||||
version = "0.3.35"
|
||||
version = "0.3.36"
|
||||
dependencies = [
|
||||
"axum 0.8.7",
|
||||
"console-subscriber",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "PMOMusic"
|
||||
version = "0.3.35"
|
||||
version = "0.3.37"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
|
||||
@@ -270,9 +270,12 @@ function selectRenderer(id: string | null) {
|
||||
snapshotState.selectedRendererId = id;
|
||||
}
|
||||
|
||||
async function fetchRenderers(force = false) {
|
||||
async function fetchRenderers(force = false, retries = 2) {
|
||||
ensureSSEInitialized();
|
||||
|
||||
let lastError: Error | null = null;
|
||||
|
||||
for (let attempt = 0; attempt <= retries; attempt++) {
|
||||
try {
|
||||
loading.value = true;
|
||||
error.value = null;
|
||||
@@ -288,14 +291,21 @@ async function fetchRenderers(force = false) {
|
||||
renderersCache.value = new Map(
|
||||
data.map((renderer) => [renderer.id, renderer]),
|
||||
);
|
||||
return;
|
||||
} catch (err) {
|
||||
error.value = err instanceof Error ? err.message : "Erreur fetch renderers";
|
||||
console.error("[useRenderers] Erreur fetch:", err);
|
||||
lastError = err instanceof Error ? err : new Error("Erreur fetch renderers");
|
||||
console.error("[useRenderers] Erreur fetch (attempt " + (attempt + 1) + "):", lastError);
|
||||
if (attempt < retries) {
|
||||
await new Promise(r => setTimeout(r, 500 * (attempt + 1)));
|
||||
}
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
error.value = lastError?.message ?? "Erreur fetch renderers";
|
||||
}
|
||||
|
||||
async function fetchRendererSnapshot(
|
||||
rendererId: string,
|
||||
opts?: { force?: boolean },
|
||||
|
||||
@@ -73,17 +73,41 @@ export function useWebRenderer() {
|
||||
let onConnectedCallback: (() => void) | null = null;
|
||||
|
||||
async function register(): Promise<void> {
|
||||
// Prevent concurrent registrations (race condition → double player)
|
||||
if (globalPlayer || registering) {
|
||||
// Allow re-registration if we have a stale player but no connection
|
||||
if (globalPlayer && !connected.value) {
|
||||
console.log('[WebRenderer] stale globalPlayer, clearing');
|
||||
globalPlayer = null;
|
||||
}
|
||||
|
||||
if (globalPlayer) {
|
||||
player = globalPlayer;
|
||||
connected.value = true;
|
||||
}
|
||||
console.log('[WebRenderer] reusing existing player');
|
||||
return;
|
||||
}
|
||||
|
||||
if (registering) {
|
||||
console.log('[WebRenderer] already registering, waiting...');
|
||||
// Wait a bit and try once
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
if (globalPlayer) {
|
||||
player = globalPlayer;
|
||||
connected.value = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
registering = true;
|
||||
|
||||
const instanceId = getOrCreateInstanceId();
|
||||
let instanceId;
|
||||
try {
|
||||
instanceId = getOrCreateInstanceId();
|
||||
} catch (e) {
|
||||
console.error('[WebRenderer] failed to get instanceId:', e);
|
||||
registering = false;
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('[WebRenderer] registering with instanceId:', instanceId);
|
||||
|
||||
try {
|
||||
@@ -122,6 +146,13 @@ export function useWebRenderer() {
|
||||
|
||||
connected.value = true;
|
||||
onConnectedCallback?.();
|
||||
|
||||
// Force refresh renderers list after registration
|
||||
// The SSE might miss the initial event
|
||||
setTimeout(() => {
|
||||
console.log('[WebRenderer] forcing renderers refresh');
|
||||
window.dispatchEvent(new CustomEvent('webrenderer-registered'));
|
||||
}, 500);
|
||||
} catch (e) {
|
||||
console.error("[WebRenderer] register error:", e);
|
||||
} finally {
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.3.35
|
||||
0.3.37
|
||||
|
||||
Reference in New Issue
Block a user