⬆️ version bump to v0.3.6

- Bump crate and app versions from `v0.3.5` to v"\n- Add retry logic with exponential backoff in `fetchRenderers`
- Improve re-registration robustness in `useWebRenderer` (stale player handling, instanceId error recovery)
- Trigger forced renderer refresh after successful registration
This commit is contained in:
2026-04-05 22:37:15 +02:00
parent 1459958978
commit 813fc97fa1
8 changed files with 77 additions and 26 deletions

View File

@@ -37,9 +37,13 @@ const myUdn = computed(() => webRenderer.rendererUdn.value);
const filteredRenderers = computed(() => {
const udn = myUdn.value;
return allRenderers.value.filter((r: RendererSummary) => {
if (r.model_name !== "WebRenderer") return true;
if (udn === null) return false;
return r.id === udn;
// Show only our own WebRenderer based on UDN match
const isWebRenderer = r.model_name?.includes("WebRenderer") ?? false;
if (isWebRenderer) {
if (udn === null) return false;
return r.id === udn;
}
return true;
});
});

View File

@@ -22,6 +22,24 @@ function generateUUID(): string {
}
const INSTANCE_ID_KEY = "pmomusic_webrenderer_instance_id";
const RENDERER_UDN_KEY = "pmomusic_webrenderer_udn";
// Load persisted UDN on module load
function loadPersistedUdn(): string | null {
try {
return sessionStorage.getItem(RENDERER_UDN_KEY);
} catch {
return null;
}
}
function savePersistedUdn(udn: string) {
try {
sessionStorage.setItem(RENDERER_UDN_KEY, udn);
} catch {
// ignore storage errors
}
}
// Module-level singleton for PMOPlayer to prevent duplicate instances
let globalPlayer: PMOPlayer | null = null;
@@ -31,7 +49,7 @@ let registering = false;
// Module-level reactive state shared across all composable invocations
const sharedConnected = ref(false);
const sharedStreamUrl = ref<string | null>(null);
const sharedRendererUdn = ref<string | null>(null);
const sharedRendererUdn = ref<string | null>(loadPersistedUdn());
function getOrCreateInstanceId(): string {
try {
@@ -86,6 +104,7 @@ export function useWebRenderer() {
const data = await resp.json();
streamUrl.value = data.stream_url;
rendererUdn.value = data.udn;
savePersistedUdn(data.udn);
player = new PMOPlayer(instanceId);
globalPlayer = player;

View File

@@ -103,14 +103,16 @@ function handleRendererSelect(rendererId: string) {
}
}
// Filtre la liste des renderers pour exclure les WebRenderers d'autres navigateurs.
// Seul le WebRenderer créé par ce navigateur (identifié par son UDN) reste visible.
// Filter to show only our own WebRenderer based on UDN match
function filterRenderers(renderers: typeof allRenderers.value) {
const myUdn = webRenderer.rendererUdn.value;
return renderers.filter((r) => {
if (r.model_name !== "WebRenderer") return true; // renderer classique : toujours visible
if (myUdn === null) return false; // pas encore de session : masquer tous les WebRenderers
return r.id === myUdn; // ne garder que le nôtre
const isWebRenderer = r.model_name?.includes("WebRenderer") ?? false;
if (isWebRenderer) {
if (myUdn === null) return false;
return r.id === myUdn;
}
return true;
});
}