Refetch schedule and stream if session is updated

This commit is contained in:
Hornwitser 2025-03-10 16:43:21 +01:00
parent 4806343250
commit f69ca520c0

View file

@ -2,7 +2,9 @@ import type { Schedule } from '~/shared/types/schedule';
let source: EventSource | null = null;
let sourceRefs = 0;
let sourceSessionId: number | undefined = undefined;
export const useSchedule = () => {
const { data: session } = useAccountSession();
const asyncData = useAsyncData<Schedule>(
'schedule',
() => $fetch("/api/schedule"),
@ -10,14 +12,9 @@ export const useSchedule = () => {
)
const { data: schedule } = asyncData;
onMounted(() => {
console.log("useSchedule onMounted", sourceRefs);
sourceRefs += 1;
if (sourceRefs !== 1) {
console.log("Event source already open");
return;
}
console.log("Opening event source");
function connect() {
console.log("Opening event source sid:", session.value?.id);
sourceSessionId = session.value?.id;
source = new EventSource("/api/events");
source.addEventListener("message", (message) => {
console.log("Message", message.data);
@ -27,15 +24,46 @@ export const useSchedule = () => {
console.log("Update", updatedSchedule);
schedule.value = updatedSchedule;
});
}
function disconnect() {
console.log("Closing event source")
source!.close();
source = null;
}
onMounted(() => {
console.log("useSchedule onMounted", sourceRefs);
sourceRefs += 1;
if (sourceRefs !== 1) {
console.log("Event source already open");
return;
}
connect();
})
watch(() => session.value?.id, () => {
if (sourceSessionId === session.value?.id) {
return;
}
sourceSessionId = session.value?.id;
console.log("Session changed, refetching schedule")
$fetch("/api/schedule").then(
data => { schedule.value = data; },
err => { console.error(err); schedule.value = { locations: [], events: []}},
)
if (source && sourceRefs > 0) {
console.log("Restarting event stream")
disconnect();
connect();
}
})
onUnmounted(() => {
console.log("useSchedule onUnmounted", sourceRefs);
sourceRefs -= 1;
if (source && sourceRefs === 0) {
console.log("Closing event source")
source.close();
source = null;
disconnect();
}
if (sourceRefs < 0) {
throw Error("Source reference count below zero");