poller and release on end to frontend

This commit is contained in:
user
2026-03-28 20:10:44 +02:00
parent e525c657ac
commit 3e018d60f9
7 changed files with 196 additions and 13 deletions

View File

@@ -1,9 +1,10 @@
<script lang="ts">
import { goto } from "$app/navigation";
import {
checkLinkValidityFresh,
mapLinkErrorToSessionEndReason,
resolveLinkFresh,
} from "$lib/domains/link/client";
import { endLinkSessionSC } from "$lib/domains/link/link.remote";
import { onMount } from "svelte";
const POLL_INTERVAL_MS = 2000;
@@ -16,14 +17,26 @@
onMount(() => {
let disposed = false;
let hasEnded = false;
let timer: ReturnType<typeof setInterval> | null = null;
let inFlight = false;
let consecutivePollErrors = 0;
const endSession = async (reason: string) => {
if (disposed) return;
if (disposed || hasEnded) return;
hasEnded = true;
if (timer) clearInterval(timer);
streamUrl = null;
if (token) {
try {
await endLinkSessionSC({ token });
} catch {
// Best-effort cleanup; user ejection should proceed regardless.
}
}
await goto(`/session-ended?reason=${encodeURIComponent(reason)}`, {
replaceState: true,
});
@@ -34,7 +47,7 @@
inFlight = true;
try {
const result = await resolveLinkFresh(token);
const result = await checkLinkValidityFresh(token);
if (disposed) return;
@@ -52,7 +65,7 @@
return;
}
const nextStreamUrl = result.data.device.streamUrl;
const nextStreamUrl = result.data.device?.streamUrl;
if (typeof nextStreamUrl === "string" && nextStreamUrl.length > 0) {
streamUrl = nextStreamUrl;
}
@@ -79,13 +92,13 @@
return;
}
const initial = await resolveLinkFresh(token);
const initial = await checkLinkValidityFresh(token);
if (initial?.error || !initial?.data) {
await endSession(mapLinkErrorToSessionEndReason(initial?.error));
return;
}
streamUrl = initial.data.device.streamUrl;
streamUrl = initial.data.device?.streamUrl ?? null;
state = "ready";
statusText = "Session active";
@@ -100,6 +113,9 @@
return () => {
disposed = true;
if (timer) clearInterval(timer);
if (!hasEnded && token) {
void endLinkSessionSC({ token });
}
};
});
</script>