poller and release on end to frontend
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user