⬆️ 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`[39m - Improve re-registration robustness in `useWebRenderer` (stale player handling, instanceId error recovery) - Trigger forced renderer refresh after successful registration
This commit is contained in:
@@ -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;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user