[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:
2026-04-06 00:08:50 +02:00
parent 23b1ce7661
commit 19451068f1
5 changed files with 68 additions and 27 deletions

View File

@@ -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;
}
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 {